亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

事物隔離級別

系統 1906 0

為了模擬并發環境,SQL SERVER中打開兩個查詢窗口(分別表示事務1、事務2)即可,并發用戶用事務1,事務2簡稱

測試表腳本:
CREATE TABLE [Customer](
??????? [CustID] [int] NOT NULL,
??????? [Fname] [nvarchar](20),
??????? [Lname] [nvarchar](20),
??????? [Address] [nvarchar](50),
??????? [City] [nvarchar](20),
??????? [State] [nchar](2) DEFAULT ('CA'),
??????? [Zip] [nchar](5) NOT NULL,
??????? [Phone] [nchar](10)
)
insert into customer values(1, 'Gary', 'Mckee', '111 Main', 'Palm Springs', 'CA', 94312, 7605551212)
insert into customer values(2, 'Tom', 'Smith', '609 Geogia', 'Fresno' 'JP', 33045, 5105551212)
insert into customer values(3, 'Jams', 'bond', 'ST Geogie 21', 'Washington', 'NY', 20331, 4405551864)



sqlserver事務隔離級別的測試:
1、read uncommitted:可以讀取其他事務未提交的數據
打開事務1,運行:
begin tran
select * from customer
??????? update customer set state = 'TN' where CustID = 3
轉到事務2,運行:
set transaction isolation level read uncommitted
begin tran
select * from customer
此時看到的數據是事務1已經更新但還未提交的(3號記錄state值TN)
2、read committed:只能讀取其他事務已經提交的數據(有進行修改的)
打開事務1,運行:
begin tran
select * from customer
??????? update customer set state = 'TN' where CustID = 3
轉到事務2,運行:
set transaction isolation level read committed
begin tran
select * from customer
此時會發現事務2一直等待,并不結束
3、repeatable read:保證使用該隔離級別的事務,在讀取數據時的數據保持一致,不會被別的事務修改、刪除數據(因為別的事務如果有修改、刪除操作會被阻塞)
開始事務1,修改事務級別為可重復讀,執行:
set transaction isolation level repeatable read
begin tran
select * from customer where State = 'CA'
得到1條記錄,這個時候事務2中運行:
set transaction isolation level repeatable read
begin tran
update Customer set state = 'JP' where state = 'CA'
commit
會發現事務2一直等待,并不結束。返回事務1,運行:
select * from customer where State = 'CA'??????????????? --2次讀取結果一致
commit
事務1成功結束后,再返回事務2,發現事務2也完成了。通過鎖機制阻塞其它事務的修改,保持了事務期間讀取的一致性
4、serializable:使用該隔離級別的事務用到的表將全部鎖定,其他事務不可以進行添加、修改、刪除
開始事務1,修改事務級別為序列化級別,執行:
set transaction isolation level serializable
begin tran
select * from customer
開始事務2,執行:
begin tran
update Customer set state = 'JP' where state = 'CA'
會發現事務2一直等待
5、snapshot:快照隔離
注意:要向使用快照隔離必須先設置當前數據庫能進行快照隔離
如:
ALTER DATABASE NetBarDB
SET ALLOW_SNAPSHOT_ISOLATION ON
在SNAPSHOT隔離下運行的事務將讀取數據,
然后由另一事務修改此數據。SNAPSHOT事務不阻塞由其他事務執行的更新操作,
它忽略數據的修改繼續從版本化的行讀取數據。
開始事務1,修改事務級別為快照級別,執行:
set transaction isolation level snapshot
begin tran
select * from customer
開始事務2,執行:
begin tran
update customer set state = 'TN' where CustID = 3
發現有一行被修改
回到事務1,執行
select * from customer
發現查詢出來的CustID = 3的state仍然是'NY'并不是'TN'



sqlserver事務常見的情況:
1、丟失更新
Sqlserver默認隔離級別是提交讀(read committed),在該級別下,可能會有丟失更新的問題。
SQL SERVER
打開事務1運行:
set transaction isolation level read committed
begin tran
select * from customer??????????????? --看到3條記錄
現在切換到事務2,此時事務1還未結束。在事務2中運行:
set transaction isolation level read committed
begin tran
select * from customer??????????????? --看到3條記錄,和事務1中相同
現在假設事務1事務繼續運行,修改數據并提交:
update customer set state = 'TK' where CustID = 3
commit
回到事務2,事務2根據先前查詢到的結果修改數據:
update customer set Zip = 99999 where state = 'NY'
commit
結果因為事務1已經修改了事務2的where條件數據,事務2未成功修改數據(其實準確的說應該算是幻象讀引起的更新失敗。不過若滿足條件的記錄數多的話,事務2的update可能更新比預期的數量少的記錄數,也可算“丟失”了部分本應完成的更新。個人認為只要明白實際上發生了什么即可,不必過分追究字眼)。丟失更新還可能有別的情形,比如事務2也是
update customer set state = 'KO' where CustID = 3
兩個事務都結束后,事務2的結果反映到數據庫中,但事務1的更新丟失了,事務2也不知道自己覆蓋了事務1的更新。

2、臟讀演示
sqlserver的默認隔離級別是提交讀(read committed)
打開事務1,運行:
begin tran
select * from customer
??????? update customer set state = 'TN' where CustID = 3
轉到事務2,運行:
set transaction isolation level read uncommitted
begin tran
select * from customer
此時看到的數據是事務1已經更新但還未提交的(3號記錄state值TN)。而如果事務1發覺數據處理有誤,轉到事務1,進行回滾:
??????? Rollback
此時事務2如根據剛讀取的數據進一步處理,會造成錯誤。它讀取的數據并未更新到數據庫,是“臟”的

3、不可重復讀
Sql server的默認級別沒有臟讀問題,但存在不可重復讀問題。
打開事務1,運行:
set transaction isolation level read committed
begin tran
select * from customer where State = 'CA'
可以得到1條記錄,這個時候事務2中運行:
set transaction isolation level read committed
begin tran
update Customer set state = 'JP' where state = 'CA'
commit
事務2插入一條記錄并提交。回到事務1,事務1繼續運行,此時它再次相同的查詢,并借此作進一步修改,卻發現讀取到的數據發生了變化。
select * from customer where State = 'CA'
--2次讀取不一致,之后的數據處理應該取消。否則不正確
update Customer set city = 'garden' where state = 'CA'
commit
讀取未能獲得記錄。也就是說在同一事務中兩次相同的查詢獲得了不同的結果,產生讀取不可重復現象

4、幻像讀
當sqlserver的隔離級別設置為可重復讀(repeatable read),可以解決上面例子出現的問題。其內部是通過事務期間保持讀鎖來實現的。
開始事務1,修改事務級別為可重復讀,執行:
set transaction isolation level repeatable read
begin tran
select * from customer where State = 'CA'
和上例一樣得到1條記錄,這個時候事務2中運行:
set transaction isolation level repeatable read
begin tran
update Customer set state = 'JP' where state = 'CA'
commit
會發現事務2一直等待,并不結束。返回事務1,運行:
select * from customer where State = 'CA'??????????????? --2次讀取結果一致
update Customer set city = 'garden' where state = 'CA'
commit
事務2成功結束后,再返回事務1,發現事務1也完成了。通過鎖機制阻塞其它事務的修改,保持了事務期間讀取的一致性。然而,如果是插入數據,則還是會出現問題:
開始事務1,修改事務級別為可重復讀,執行:
set transaction isolation level repeatable read
begin tran
select * from customer where State = 'CA'
得到1條記錄,這個時候事務2中運行:
set transaction isolation level repeatable read
begin tran
insert into customer values(4, 'hellow', 'world', 'paradise 001', 'garden', 'CA', 00000, 1119995555)
commit
發現事務2立刻提交并正常結束了。返回事務1,運行:
select * from customer where State = 'CA'
會發現得到了2條記錄。這種現象就叫做幻像讀。

事物隔離級別


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 四虎影视国产精品永久在线 | 国产精品欧美久久久久天天影视 | 九九99热久久精品在线6手机 | 国产伦理久久精品久久久久 | 天天插日日操 | 亚洲已满18点击进入在线观看 | 国产精品久久久久久久久ktv | 新久草视频 | 国产在线小视频 | 精品特级一级毛片免费观看 | 国产精品久久天天影视 | 欧美日韩中文在线视频 | 露脸真实国产精品自在 | 337p欧美超大胆日本人术艺术 | 夜夜躁日日躁狠狠 | 日韩中文视频 | 日本中文字幕在线视频 | 亚洲日本高清影院毛片 | 日本在线亚州精品视频在线 | 青青久草 | 天天摸夜夜摸夜夜狠狠摸 | 十级毛片| h片免费在线观看 | 九九热在线免费观看 | 九九久久久2 | 国产欧美一区视频在线观看 | 国产女人体一区二区三区 | 精品国产一区二区三区免费 | 久久精品国产亚洲妲己影院 | 成年午夜视频免费观看视频 | 国产精品自拍视频 | 国产精品高清久久久久久久 | 99热久久国产精品免费观看 | 欧美日本激情 | 丁香婷婷影音先锋5566 | 久青草国产手机视频免费观看 | 在线日本妇人成熟免费观看 | 日韩精品欧美一区二区三区 | 伊人久久大香线蕉亚洲 | 久久久久久久久免费视频 | 激情国产白嫩美女在线观看 |