--先创建表: CREATE TABLE tb(id int,val int) INSERT tb VALUES(1,10) INSERT tb VALUES(2,20)然后在连接1中,执行: SET TRANSACTION ISOLATION LEVEL READ COMMITTED BEGIN TRANSACTION SELECT * FROM tb; --这个SELECT结束后,就会释放掉共享锁
WAITFOR DELAY '00:00:05' --模拟事务处理,等待5秒
SELECT * FROM tb; --再次SELECT tb表 ROLLBACK --回滚事务在连接2中,执行 UPDATE tb SET val = val + 10 WHERE id = 2;-------- 回到连接1中.可以看到.两次SELECT的结果是不同的. 因为在默认的READ COMMITTED隔离级别下,SELECT完了.就会马上释放掉共享锁. --示例2.REPEATABLE READ连接1:SET TRANSACTION ISOLATION LEVEL REPEATABLE READ BEGIN TRANSACTION SELECT * FROM tb; --这个SELECT结束后,就会释放掉共享锁
WAITFOR DELAY '00:00:05' --模拟事务处理,等待5秒
SELECT * FROM tb; --再次SELECT tb表 ROLLBACK --回滚事务 连接2: UPDATE tb SET val = val + 10 WHERE id = 2;--- 可以看到连接2被阻塞了.而且连接1中.两次SELECT的结果是一样的. 因为REPEATABLE READ隔离级别下的共享锁保留到事务结束. 所以别的事务的X锁与S锁不兼容.所以连接2等待.
CREATE TABLE tb(id int,val int)
INSERT tb VALUES(1,10)
INSERT tb VALUES(2,20)然后在连接1中,执行:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION
SELECT * FROM tb; --这个SELECT结束后,就会释放掉共享锁
WAITFOR DELAY '00:00:05' --模拟事务处理,等待5秒
SELECT * FROM tb; --再次SELECT tb表
ROLLBACK --回滚事务在连接2中,执行
UPDATE tb SET
val = val + 10
WHERE id = 2;--------
回到连接1中.可以看到.两次SELECT的结果是不同的.
因为在默认的READ COMMITTED隔离级别下,SELECT完了.就会马上释放掉共享锁.
--示例2.REPEATABLE READ连接1:SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION
SELECT * FROM tb; --这个SELECT结束后,就会释放掉共享锁
WAITFOR DELAY '00:00:05' --模拟事务处理,等待5秒
SELECT * FROM tb; --再次SELECT tb表
ROLLBACK --回滚事务
连接2:
UPDATE tb SET
val = val + 10
WHERE id = 2;---
可以看到连接2被阻塞了.而且连接1中.两次SELECT的结果是一样的.
因为REPEATABLE READ隔离级别下的共享锁保留到事务结束.
所以别的事务的X锁与S锁不兼容.所以连接2等待.
示例2中的"--这个SELECT结束后,就会释放掉共享锁" copy时应该修改下。