数据库事务隔离和锁

概述

数据库事务隔离和锁的东西,学习了一下,现讲解一下自己的理解

数据库事务隔离

概念

事务:把多条sql语句作为一个整体和数据库交互。这里需要注意,一个事务可有多条SQL语句,虽然这些SQL语句最终的结果变成一个整体,要成功都成功,要失败都失败,但是,里面的每条SQL语句却是单条执行的。

数据库事务隔离:讲的是多个事务(操作同一张表)之间,一个事务内部单条select语句执行的结果在其他事务中的时机。

事务隔离级别

Read Uncommitted:读未提交,事务中的select语句查询表的结果是,其他事务未提交的时刻,即,事务1对表1的select,查到了事务2的Update语句的结果,虽然,事务2中update之后的语句还没有执行。

Read Committed:读已提交,事务1对表1的select,查到的结果是其他对表1以commit的事务,实机是其他事务执行完成,对于其中途的更新,事务1不会读到结果。

Repeatable table:可重复读,事务1中对表1的select读到的结果是不变的,注意,如果读后有更新操作,并且又读表1,那么,此时读到的是已提交的数据,所以,这个隔离级别有可能产生幻读(后面讲这个概念)。

Serializable:序列化,事务的各种问题,都是因为数据库允许多个事务可以并行执行,但是,如果我们让数据库串行执行事务,那么不就什么问题都没有了嘛,Serializable就是这个隔离级别

脏读、幻读、可重复读和不可重复读

这些概念的产生也是因为多个事务并发产生的,所以,在理解这些内容的时候,一定要想着多个事务同时执行的这么一个情况。

脏读:事务1对表1的select查询(一条记录),读取的是事务2对表1(该条记录)update结果后的内容,此时,事务2回滚,此时事务1读到的数据就是脏数据,称此为脏读,即:这条记录的内容是不真实的。

幻读:事务1对表1的select查询获得结果(一条记录)后,事务2对表1insert一条记录,然后,事务1又使用该select语句查询结果(两条记录),发现信息量的变了,称此为幻读,即:原信息内容没有变,但是量不同了。

重复读:事务1对表1的select查询得到结果后,这个结果是在之后的select查询是不变的(之前没有更新语句) ,称此为重复读。不可重复读与之相反。

数据库锁

关于数据库锁的内容,只讲解共享锁,更新锁和排它锁的特性。

共享锁、更新锁和排它锁之间的关系

单个资源可以有多个共享锁;单个资源有了排他锁后,不可以加其它的锁;单个资源上有了其它锁(共享锁或更新锁)后,不可以再给这个资源直接加上一个排它锁;单个资源只能有一个更新锁;单个资源可以在有更新锁的同时,再给资源加上共享锁,并且,之后,这个资源的更新锁可以在这个共享锁存在的时候进行升级,转换为排它锁;

死锁

单个SQL语句都具有锁,默认的select语句执行时,给资源加了共享锁,一旦select执行完成,那么这个共享锁也就没有了,即使默认select语句在事务中,此时易造成一个死锁,那就单个select执行的时间太长,并且执行的次数多,这个时候,表内容的更新就会等,等到表中一个共享锁都没有的时候才可以执行,这种情况的执行我们可以使用单条select不加共享锁的语句解决。

更新的SQL语句加的为排它锁,当更新语句在事务中时,就会把锁的生命周期变成和事务一样的长,此时需要注意,访问资源的顺序,可能会造成死锁的问题。

总结

上面的内容不是很完整,例如:事务的隔离级别对脏读、幻读和不可重复读的影响。死锁的那块内容下去可以接在SQL Server上做实验。

时间: 2024-10-09 21:20:54

数据库事务隔离和锁的相关文章

MySQL数据库事务隔离级别(Transaction Isolation Level)

今天在学习JDBC的时候看到了关于MySql的事务的隔离级别的问题,感觉内容挺高级的,所以记录一篇文章,以备后面使用. 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. 2 [mysqld] 3 transaction-isolation = R

Atitit.数据库事务隔离级别 attilax 总结

Atitit.数据库事务隔离级别 1. 事务隔离级别的作用 1 2. 在的隔离级别 2 3. 常见数据库的默认管理级别 3 1. 事务隔离级别的作用 较低的隔离级别可以增强许多用户同时访问数据的能力,但也增加了用户可能遇到的并发副作用(例如脏读或丢失更新)的数量.相反,较高的隔离级别减少了用户 可能遇到的并发副作用的类型,但需要更多的系统资源,并增加了一个事务阻塞其他事务的可能性.应平衡应用程序的数据完整性要求与每个隔离级别的开销,在此 基础上选择相应的隔离级别.最高隔离级别(可序列化)保证事务

Net Core中数据库事务隔离详解——以Dapper和Mysql为例

Net Core中数据库事务隔离详解--以Dapper和Mysql为例 事务隔离级别 准备工作 Read uncommitted 读未提交 Read committed 读取提交内容 Repeatable read (可重读) Serializable 序列化 总结 事务隔离级别 .NET Core中的IDbConnection接口提供了BeginTransaction方法作为执行事务,BeginTransaction方法提供了两个重载,一个不需要参数BeginTransaction()默认事务

数据库事务隔离级别-- 脏读、幻读、不可重复读

一.数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四个级别可以逐个解决脏读 .不可重复读 .幻读 这几类问题. √: 可能出现    ×: 不会出现   脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意

数据库事务隔离级别(转)

1.什么是事务,事务的特性是什么? 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行. SQL92标准定义了数据库事务的四个特点: 原子性(Atomicity):一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做. 一致性(Consistency):事务开始时,数据库中的数据是一致的,事务结束时,数据库的数据也应该是一致的. 隔离性

数据库事务隔离级别与锁

一.事务的4个基本特征     所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位.例如,在关系数据库中,一个事务可以是一条SQL语句.一组SQL语句或整个程序. 事务ACID特性. ACID就是:原子性(Atomicity ).一致性( Consistency ).隔离性或独立性( Isolation)和持久性(Durabilily). 事务和程序是两个概念.一般地讲,一个程序中包含多个事务.事务的开始与结束可以由用户显式控制.如果用户没有显式地定义事

数据库:自己理解的“数据库事务隔离级别”

转载请注明出处: jiq?钦's technical Blog - 季义钦 引言:在网上搜了很多关于事务的文章,感觉单独来看都很难看懂,所以综合自己的理解写一篇我自己能理解的关于关系型数据库事务的文章. 一.事务特征 我们都知道数据库事务具备ACID特性: Atomic(原子性):一个事务要么成功,要么失败 Consistency(一致性):一致性代表了底层数据存储的完整性.事务执行前后数据库都必须处于一个合法的状态.什么才是一个合法的状态? 比如满足数据库的唯一性约束.数据类型验证.引用完整性

MSSQL数据库 事务隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四个级别可以逐个解 脏读 .不可重复读 .幻读 这几类问题. √: 可能出现    ×: 不会出现   脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意:我们讨论隔离级别的场景

数据库事务隔离级别及传播行为

一.隔离级别: 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Serializable,这四个级别可以逐个解决脏读.不可重复读.幻读这几类问题. 1. ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据.      这种隔离级别会产生脏读,不可重复读和幻像读.2. ISOLATION_READ_COMMITTED:保证一个事务修改的