sql server 并发控制简单介绍
并发控制概述
丢失修改(lost update)
当事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1修改被丢失。
不可重复读(non-repeatable read)
事务T1读取数据后,事务T2执行了更新操作,使T1无法再现前一次读取结果。具体包括三种情况:
1.事务T1读取某一数据后,事务T2对其进行了修改,当事务T1再次读该数据时,得到与之前不同的值。(在一个窗口中修改了表中的某个数据后,另一个窗口中的值也改变了)
2.当事务T1按一定条件读取某些数据后,事务T2删除了其中的部分记录,当T1再次按相同条件读取时,某些数据消失了。
3.当事务T1按照以一定条件读取某些数据后,事务T2插入了一些记录,当T1再次按照相同条件读取时,发现多了一些数据。
读“脏”数据(dirty read)(一窗口修改了数据后并执行,二窗口读到了修改后的值,此时一窗口修改事务被撤销,二窗口仍读到的是更新后的值)
事务T1修改某一数据并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销了,这时被T1修改过的数据恢复了原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为“脏”数据.
注:产生数据不一致的主要原因是并发操作破坏了事务的隔离性
封锁
封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放他的锁之前,其他事务不能更新此数据。
基本锁分类
1) 排他锁(写锁、X锁):若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他事务不能对A加任何锁
2) 共享锁(读锁、S锁):若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,不能加X锁。