SQL Server事务的隔离级别
SQL Server事務(wù)的隔離級別
########## 數(shù)據(jù)庫中數(shù)據(jù)的一致性 ##########
針對并發(fā)事務(wù)出現(xiàn)的數(shù)據(jù)不一致性,提出了4個級別的解決方法:
| ?隔離級別 | ?第一類丟失更新 | ?臟讀 | 不可重復(fù)讀 | ?第二類丟失更新 | ?虛讀 |
| ?未提交讀 | ?未發(fā)生 | ?發(fā)生 | ?發(fā)生 | ?發(fā)生 | ?發(fā)生 |
| ?提交讀 | ?未發(fā)生 | ?未發(fā)生 | ?發(fā)生 | ?發(fā)生 | ?發(fā)生 |
| ?可重復(fù)讀 | ?未發(fā)生 | ?未發(fā)生 | ?未發(fā)生 | ?未發(fā)生 | ?發(fā)生 |
| ?串行化 | ?未發(fā)生 | ?未發(fā)生 | ?未發(fā)生 | ?未發(fā)生 | ?未發(fā)生 |
1.未提交讀
采用排它鎖(update, insert, delete),解決了丟失更新問題,但是臟讀仍然會出現(xiàn)。
例1:
begin tran
update t1 set t1.name = 'yyy'
waitfor delay '00:00:10' --等待10秒
rollback tran
例2:
set transaction isolation level read uncommitted
begin tran
select * from t1
commit tran
結(jié)果:例2返回更新后的值(yyy),盡管最后更新回滾了。
?
2.提交讀
采用共享鎖(select)+排它鎖(update, insert, delete),解決了丟失更新問題,也解決了臟讀問題。SQL Server默認屬于這個隔離級別。
?
3.可重復(fù)讀
采用修改鎖(update)+排它鎖(insert, delete)+共享鎖(select),解決了丟失更新問題,臟讀問題,但是會出現(xiàn)幻像讀。
例3:
set transaction isolation level repeatable read
begin tran
select * from t1
waitfor delay '00:00:10'
select * from t1
commit tran
例4:
set transaction isolation level repeatable read
begin tran
delete from t1 where t1.id = 8
commit tran
結(jié)果:例3,2次返回的結(jié)果集都一樣,都含有t1.id=8的行。
?
4.可串行讀
采用一個事務(wù)執(zhí)行完后,才能執(zhí)行第2個事務(wù)(被阻塞)的串行方式,解決了以上所有的問題。
例5:
set transaction isolation level serializable
begin tran
select * from t1
waitfor delay '00:00:10'
commit tran
例6:
set transaction isolation level serializable
begin tran
delete from t1 where t1.id = 9
commit tran
結(jié)果:例5,2次都返回一樣的結(jié)果,是刪除前的。只能說明實現(xiàn)了可重復(fù)讀級別的事務(wù)。
例7:
set transaction isolation level serializable
begin tran
select * from t1
waitfor delay '00:00:10'
select * from t1
commit tran
例8:
set transaction isolation level serializable
begin tran
insert into t1(name) values('zhang')
commit tran
結(jié)果:例7,2次都返回一樣的結(jié)果,都是添加前的結(jié)果集。結(jié)合前面的例子說明是串行級別。
轉(zhuǎn)載于:https://www.cnblogs.com/wuxiang/p/3656171.html
總結(jié)
以上是生活随笔為你收集整理的SQL Server事务的隔离级别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解決 IE10 浏览器无法使用 ASP.
- 下一篇: paip.最好的脚本语言node js