sqlserver锁和隔离级别
概念:
常见的锁相关概念参见 sqlserver中的锁
隔离级别:
未提交读,读取到未提交的数据
已提交读,
1,悲观模式(is_read_committed_snapshot_on=0,默认设置),传统的已提交读,只能读取到已经提交的数据。读写会产生冲突。
2,乐观模式(is_read_committed_snapshot_on=1),加入行版本控制,只能读取到已提交的数据,读写不会产生冲突,并发性更好,生产环境需要测试。
可重复读,一个事务中,多次读取相同的一条或者几条数据,看到的结果是一样的
可序列化,这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
快照隔离,启用 SNAPSHOT(快照) 隔离级别时,每次更新行时,SQL Server 数据库引擎在 tempdb 中存储原始行的副本,并为该行添加事务序列号。
快照和MVCC
目前多数关系数据库采用2PL协议保证了并发事务执行的可串行化,这样就产生了读写互斥的问题,即S锁和X锁的互斥。
多版本并发控制(Multi-Version Concurrency Control,MVCC)较好地解决了这一问题。在多版本的系统中,每一次写数据均产生一个新的版本,读操作可以根据需要读取合适的版本,因此读写操作互不阻塞。MVCC虽然提高了并发度,但也带来了维护多个版本的存储开销。
Microsoft SQL Server 数据库引擎引入了现有事务隔离级别的一种新的实现方式 - 已提交读,用于提供使用行版本控制的语句级快照。SQL Server 数据库引擎还引入了一个新的事务隔离级别 - 快照,用于提供也使用行版本控制的事务级快照。
版本存储区是 tempdb 中的数据页集合。如果有多个事务修改行,则该行的多个版本将被链接到一个版本链中。使用行版本控制的读操作将检索每一行在事务或语句启动时已提交的最后一个版本。