(2)在获得共享锁的事务完成之前,没有其他事务能够获得排他锁修改这一数据资源,且当其他事务增加能够满足当前事务的读操作的查询搜索条件的新行时,其他事务将会被阻塞,直到当前事务完成然后释放共享锁,其他事务才能获得排他锁进行插入操作。
(3)事务中的读操作在任何情况下读取到的数据是一致的,不会出现幻影行。
(4)范围锁:读操作锁定满足查询搜索条件的整个范围的锁
5.隔离级别总结
隔离级别 是否读取未提交的行 是否不可重复读 是否丢失更新 是否幻读 共享锁持续时间 是否持有范围锁
未提交读 READ UNCOMMITTED Y Y Y Y 当前语句 N
已提交读 READ COMMITTED N Y Y Y 当前语句 N
可重复读REPEATABLE READ N N N Y 事务开始到事务完成 N
可序列化SERIALZABLE N N N N 事务开始到事务完成 Y
四.死锁
死锁是指一种进程之间互相永久阻塞的状态,可能涉及两个或更多的进程。
打开两个查询窗口,Connetion1,connection2
Step1: 执行Connection1的SQL 语句
Step2: 执行Connection2的SQL 语句
执行语句 事务 执行语句
Connetion1 A
SET TRANSACTION ISOLATION LEVEL READ COMMITTED BEGIN TRAN UPDATE dbo.myProduct SET price = price + 1 WHERE id=1 SELECT * FROM dbo.myOrder WHERE id =1
Connection2 B
SET TRANSACTION ISOLATION LEVEL READ COMMITTED BEGIN TRAN UPDATE dbo.myOrder SET customer = 'ddd' WHERE id = 1 SELECT * FROM dbo.myProduct WHERE id = 1
两个事务的流程图:
阶段1:Price=10,事务A对myProduct表请求排他锁。Customer = aaa,事务B对myOrder请求排他锁
阶段2:事务A对myProduct表使用了排他锁,更新price = price + 1。然后事务B对myOrder表使用了排他锁,更新customer=ddd。