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

事物隔離級別

系統 2245 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繼續運行,此時它再次相同的查詢,并借此作進一步修改,卻發現讀取到的數據發生了變化。
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條評論
主站蜘蛛池模板: 亚洲小younv另类 | 最近在线更新中文字幕1 | 嘿嘿嘿视频免费网站在线观看 | 国产夫妻久久 | 色婷婷激婷婷深爱五月小蛇 | 四虎影院免费在线播放 | 一区二区三区中文 | 久久午夜网 | 久久亚洲精品tv | 越南黄色录像 | 妇女网站爱嘿嘿视频免费观看 | 国产区精品在线 | 精品亚洲一区二区三区在线播放 | 久久精品国产免费看久久精品 | 亚洲精品国产一区二区在线 | 国产图片亚洲精品一区 | 狠狠综合久久久久综 | 四虎私人影院 | 亚洲香蕉网综合久久 | 99精品视频在线观看免费 | 欧美亚洲国产成人精品 | 久久久久国产一级毛片高清片 | 日本一区二区三区不卡在线视频 | 欧美 亚洲 中文字幕 | 美女视频很黄很黄又免费的 | 国内精品伊人久久久影院 | 亚洲精品美女久久久久99 | 亚洲成人在线视频播放 | 国产成人精品亚洲日本在线观看 | 欧美啪啪网站 | 亚洲国产精选 | 久插视频 | 狠狠狠色丁香婷婷综合久久五月 | 国产一区二区三区欧美 | 一级做a爰片性色毛片2021 | 久久精彩| 亚洲精品国产不卡在线观看 | 91嫩草国产线免费观看 | 精品精品国产理论在线观看 | 亚洲成人黄色 | 逼毛片 |