4种隔离级别的理解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
waitfor delay '00:00:02' 延时2 秒
■ Read uncommitted—Permits dirty reads but not lost updates. One transaction may not write to a row if another uncommitted transaction has already written to it. Any transaction may read any row, however. This isolation level may be implemented using exclusive write locks.
未提交读。
未授权读取-允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时写。但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。例:
事务A开始修改该数据;
事务B不允许同时修改该数据,但允许读取该数据。
事务A:
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
UPDATE tb_User SET password='111111' WHERE account='sys'
--ROLLBACK --故意不提交或回滚
事务B:
SET LOCK_TIMEOUT 3000
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT * FROM tb_User WHERE account='sys' --可以
UPDATE tb_User SET password='abc' WHERE account='sys' --不可以
■ Read committed—Permits unrepeatable reads but not dirty reads. This may be achieved using momentary shared read locks and exclusive write locks. Reading transactions don’t block other transactions from accessing a row. However, an uncommitted writing transaction blocks all other transactions from accessing the row.
提交读。
授权读取-允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
例:
事务A开始修改该数据;
事务B不允许同时修改该数据,也不允许读取该修改的数据。
事务A:
BEGIN TRAN
UPDATE tb_User SET password='111111' WHERE account='sys'
--ROLLBACK --故意不提交或回滚
事务B:
SET LOCK_TIMEOUT 3000
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
UPDATE tb_User SET password='abc' WHERE account='sys' --不可以SELECT * FROM tb_User WHERE account='sys' --不可以
SELECT * FROM tb_User WHERE account='zxh' --可以(因该数据没有被修改)
■Repeatable read—Permits neither unrepeatable reads nor dirty reads. Phantom reads may occur. This may be achieved using shared read locks and exclusive write locks. Reading transactions block writing transactions (but not other reading transactions), and writing transactions block all other transactions. 可重复读取。
可重复读取-禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享
读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),但是允许插入
数据(产生幻像),写事务则禁止任何其他事务。
例:
事务A开始读取该数据;
事务B不允许同时修改该数据,但允许添加数据,也允许读取该数据。
事务A:
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
SELECT * FROM tb_User
--ROLLBACK --故意不提交或回滚
事务B:
SET LOCK_TIMEOUT 3000
UPDATE tb_User SET password='abc' WHERE account='sys' --不可以
Delete From tb_User Where account = 'lld' --不可以
INSERT tb_User Values('aaa','bbb','2010-12-19') --可以
SELECT * FROM tb_User WHERE account='sys' --可以