SQLServer 事务隔离级别与锁的申请和释放

脏读:当一个事务开始更新数据,但是这个事务并没有完全提交,这个时候第二个事务开始读取数据,把第一个事务所更改的数据读了出来,

第二个事务读取的数据时临时的,因为有可能第一个事务最终有可能做回滚操作

不可重复读:在一个事务中多次读取某一行数据,可能会得到不同的结果

幻读:在一个事务中,我们读取数据,发现没有特定的行,第一个事务还没结束,这个时候第二个事务插入了该行数据,

然后在第一个事务再次读取时,该行数据突然出现了

SQLServer数据库支持一下隔离级别:未提交读、已提交读、可重复读、快照、可序列化。

  • 未提交读(可以读取已由其他事务修改但未提交的行)

    • 不会发出共享来防止其他事务修改当前事务读取的数据
    • 也不会被排它锁阻塞
  • 已提交读(指定语句不能读取已由其他事务修改但未提交的数据,所以可以避免脏读)
    • 其他事务可以在当前事务的各个语句间更新数据,从而产生不可重复读和幻读
    • 数据库会在读的时候使用共享锁来防止其他事务在当前事务执行读取操作期间修改行,共享锁还会阻止语句在其他事务完成之前读取由这些事务修改的行,
    • 语句运行完后释放共享锁,而不是等到事务提交的时候
  • 可重复读(在一个事务中多次读取某一行数据,可能会得到相同的结果)
    • 对事务中的每个语句所读取的全部数据都设置了共享锁,并且共享锁一直保持到事务完成为止
  • 快照
    • 在任何一个修改之前,先对修改前的版本做一个复制,后续的一切读操作都会去读这个复制的版本,修改将创建一个新的版本,这种处理方式可以保证读写不会相互阻塞
  • 可序列化
  • 可序列化的要求是除了可重复读以外,还要求当前事务完成前,其他事务不能使用当前事务中任何语句的读取键值进行插入和删除操作。SQLServer通过加范围锁的方式来实现可序列化
隔离级别 是否申请共享锁 何时释放 有无范围锁
未提交读 不申请 --
已提交读 申请 当前语句执行完
可重复读 申请 事务提交时
可序列化 申请 事务提交时


不同隔离级别的并发副作用:

隔离级别 脏读 不可重复读 幻读
未提交读
已提交读
可重复读
快照
可序列化
时间: 2024-10-29 19:11:39

SQLServer 事务隔离级别与锁的申请和释放的相关文章

事务的隔离级别与锁的申请和释放

脏读(Dirty Read)     脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚 不可重复读(Unrepeatable Read) 不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据.这是由于查询时系统中其他事务修改的提交而引起的. 例如:事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改.事务B中再次查询时,数据发生了改变 幻读(phantom read) 幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对

MySQL数据库引擎、事务隔离级别、锁

MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行效率比InnoDB类型更快,但是不支持事务,而InnoDB提供事务支持以及外键等高级数据库功能. 具体实现的区别: InnoDB不支持FULLTEXT类型的索引 InnoDB中不保存表的具体行数,也就是说,执行查询SQL时,InnoDB要扫描一遍整个表来计算有多少行,而MyISAM只要简单的

mysql事务隔离级别与锁的关系

其实操作了这么久mysql一直也没有把mysql中事务跟锁的关系弄得特别清楚.然后搜到美团这篇文章,顺便结合一下自己遇到的问题总结一下. 首先事务有四种隔离级别: Reference: http://tech.meituan.com/innodb-lock.html Innodb中的事务隔离级别和锁的关系

SqlServer中的事务隔离级别、锁机制

事务 作用:用来执行一连串的动作,并且保证所有动作要么都执行.要么都不执行. 属性:原子行.一致性.隔离性.持久性 锁 作用:SqlServer使用锁来实施事务隔离属性. 阻塞 定义:如果一个事务持有一数据资源的锁,而另一事务请求相同资源的不兼容的锁,则新锁的请求将被阻塞. 默认情况下,被阻塞的请求会一直等待,直到原来的事务释放相关的锁. 事务的隔离级别 可设置的有6个(从上往下 隔离级别越来越高): 1.read uncommitted 2.read committed 3.repeatabl

Innodb中的事务隔离级别和锁的关系

前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在.这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么. #一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道

Innodb中的事务隔离级别和锁的关系(转)

原文:http://tech.meituan.com/innodb-lock.html 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在.这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么. 一次封锁or两段锁? 因为有大量的并

MySQL InnoDB中的事务隔离级别和锁的关系

前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在.这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么. 一.一次封锁or两段锁因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会

Innodb 中的事务隔离级别和锁的关系

转自:https://tech.meituan.com/innodb-lock.html 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在.这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么. #一次封锁or两段锁?因为有大量的

数据库事务隔离级别与锁

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