黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

數(shù)據(jù)庫事務(wù)

系統(tǒng) 2022 0

?

數(shù)據(jù)庫的事務(wù)隔離級別:

1.Read Commited 可讀已提交
?? 2.Read Uncommited 可讀未提交
?? 3.Repeatable Read 可重復(fù)讀
?? 4.Serializable 串行化

sqlserver默認的事務(wù)隔離級別是:讀可提交。

?

各種并發(fā)問題

1. 第一類丟失更新(lost update): 在完全未隔離事務(wù)的情況下,兩個事物更新同一條數(shù)據(jù)資源,某一事物異常終止,回滾造成第一個完成的更新也同時丟失。

? 事務(wù)1 事務(wù)2
1 開啟事務(wù) ?
2 ? 開啟事務(wù)
3 取出數(shù)據(jù) age=20 ?
4 ? 取出數(shù)據(jù) age=20
5 更新數(shù)據(jù) age=30 ?
6 ? 更新數(shù)據(jù) age=35,并提交事務(wù)
7 回滾事務(wù) ?

?

?

在T1時刻開啟了事務(wù)1,T2時刻開啟了事務(wù)2,在T3時刻事務(wù)1從數(shù)據(jù)庫中取出了id="402881e535194b8f0135194b91310001"的數(shù)據(jù),T4時刻事務(wù)2取出了同一條數(shù)據(jù),T5時刻事務(wù)1將age字段值更新為30,T6時刻事務(wù)2更新age為35并提交了數(shù)據(jù),但是T7事務(wù)1回滾了事務(wù)age最后的值依然為20,事務(wù)2的更新丟失了,這種情況就叫做"第一類丟失更新(lost update)"。

2. 臟讀(dirty read):如果第二個事務(wù)查詢到第一個事務(wù)還未提交的更新數(shù)據(jù),形成臟讀。

? 事務(wù)1 事務(wù)2
1 開啟事務(wù) ?
2 ? 開啟事務(wù)
3 取出數(shù)據(jù) age=20 ?
4 ? ?
5 更新 age=30 ?
6 ? 讀取數(shù)據(jù) age=30(臟讀)
7 ? ?

?

在T1時刻開啟了事務(wù)1,T2時刻開啟了事務(wù)2,在T3時刻事務(wù)1從數(shù)據(jù)庫中取出了id="402881e535194b8f0135194b91310001"的數(shù)據(jù),在T5時刻事務(wù)1將age的值更新為30,但是事務(wù)還未提交,T6時刻事務(wù)2讀取同一條記錄,獲得age的值為30,但是事務(wù)1還未提交,若在T7時刻事務(wù)1回滾了事務(wù)2的數(shù)據(jù)就是錯誤的數(shù)據(jù)(臟數(shù)據(jù)),這種情況叫做" 臟讀(dirty read)"。

3. 虛讀(phantom read):一個事務(wù)執(zhí)行兩次查詢,第二次結(jié)果集包含第一次中沒有或者某些行已被刪除,造成兩次結(jié)果不一致,只是另一個事務(wù)在這兩次查詢中間插入或者刪除了數(shù)據(jù)造成的。

? 事務(wù)1 事務(wù)2
1 開啟事務(wù) ?
2 ? 開啟事務(wù)
3 查詢數(shù)據(jù),有一條記錄 ?
4 ? 插入一條記錄
5 ? ?
6 ? 提交事務(wù)
7 查詢數(shù)據(jù),有2條記錄 ?

?

在T1時刻開啟了事務(wù)1,T2時刻開啟了事務(wù)2,T3時刻事務(wù)1從數(shù)據(jù)庫中查詢所有記錄,記錄總共有一條,T4時刻事務(wù)2向數(shù)據(jù)庫中插入一條記錄,T6時刻事務(wù)2提交事務(wù)。T7事務(wù)1再次查詢數(shù)據(jù)數(shù)據(jù)時,記錄變成兩條了。這種情況是"虛讀(phantom read)"。

4. 不可重復(fù)讀(unrepeated read):一個事務(wù)兩次讀取同一行數(shù)據(jù),結(jié)果得到不同狀態(tài)結(jié)果,如中間正好另一個事務(wù)更新了該數(shù)據(jù),兩次結(jié)果相異,不可信任。

? 事務(wù)1 事務(wù)2
1 開啟事務(wù) ?
2 ? 開啟事務(wù)
3 查詢數(shù)據(jù),age=20 ?
4 ? 查詢數(shù)據(jù),age=20
5 ? 更新數(shù)據(jù),age=30
6 ? 提交事務(wù)
7 查詢數(shù)據(jù),age=30 ?
8 ? ?
9 ? ?

?

在T1時刻開啟了事務(wù)1,T2時刻開啟了事務(wù)2,在T3時刻事務(wù)1從數(shù)據(jù)庫中取出了id="402881e535194b8f0135194b91310001"的數(shù)據(jù),此時age=20,T4時刻事務(wù)2查詢同一條數(shù)據(jù),T5事務(wù)2更新數(shù)據(jù)age=30,T6時刻事務(wù)2提交事務(wù),T7事務(wù)1查詢同一條數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)與第一次不一致。這種情況就是"不可重復(fù)讀(unrepeated read)"。

5. 第二類丟失更新(second lost updates):是不可重復(fù)讀的特殊情況,如果兩個事務(wù)都讀取同一行,然后兩個都進行寫操作,并提交,第一個事務(wù)所做的改變就會丟失。

? 事務(wù)1 事務(wù)2
1 開啟事務(wù) ?
2 ? 開啟事務(wù)
3 更新數(shù)據(jù),age=25 ?
4 ? ?
5 ? 更新數(shù)據(jù),age=30
6 提交事務(wù) ?
7 ? 提交事務(wù)

?

在T1時刻開啟了事務(wù)1,T2時刻開啟了事務(wù)2,T3時刻事務(wù)1更新數(shù)據(jù)age=25,T5時刻事務(wù)2更新數(shù)據(jù)age=30,T6時刻提交事務(wù),T7時刻事務(wù)2提交事務(wù),把事務(wù)1的更新覆蓋了。這種情況就是"第二類丟失更新(second lost updates)"。

?

數(shù)據(jù)庫事務(wù)隔離級別

隔離級別 是否出現(xiàn)第一類丟失更新 是否出現(xiàn)臟讀 是否出現(xiàn)虛讀 是否出現(xiàn)不可重復(fù)讀 是否出現(xiàn)第二類丟失更新
Serializable
Repeatable Read
Read Commited
Read Uncommited

?

數(shù)據(jù)庫的事務(wù)隔離級別越高,越能解決并發(fā)中可能出現(xiàn)的問題。但是處理并發(fā)的能力就越弱。

也就是說,如果數(shù)據(jù)庫事務(wù)采用serializable級別的隔離級別,就不會發(fā)生并發(fā)的問題。但處理數(shù)據(jù)的能力非常弱。大部分數(shù)據(jù)庫都采用的是read commited隔離級別。

那怎么來解決并發(fā)中可能出現(xiàn)的問題呢?需要用到數(shù)據(jù)庫鎖。悲觀鎖和樂觀鎖。

悲觀鎖,正如其名,它指的是對數(shù)據(jù)被外界(包括本系統(tǒng)當前的其他事務(wù),以及來自外部系統(tǒng)的事務(wù)處理)修改持保守態(tài)度,因此,在整個數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)。悲觀鎖的實現(xiàn),往往依靠數(shù)據(jù)庫提供的鎖機制(也只有數(shù)據(jù)庫層提供的鎖機制才能真正保證數(shù)據(jù)訪問的排他性,否則,即使在本系統(tǒng)中實現(xiàn)了加鎖機制,也無法保證外部系統(tǒng)不會修改數(shù)據(jù))。

一個典型的悲觀鎖的調(diào)用:select * from users where name=’leo’ for update.

? 取款事務(wù) 存款事務(wù)
1 開始事務(wù) ?
2 ? 開始事務(wù)
3 select * from accounts where id=1 for update;
查詢結(jié)果顯示存款余額為1000元,這條記錄被鎖定
?
4 ? select * from accounts where id=1 for update;執(zhí)行該語句時,事務(wù)停下來等待取款事務(wù)解除對這條記錄的鎖定。
5 取出100元。把存款余額改為900元。 ?
6 提交事務(wù) ?
7 ? 事務(wù)回復(fù)運行,查詢結(jié)果顯示存款余額為900元。這條記錄被鎖定。
8 ? 匯入100元,把存款余額改為1000元。
9 ? 提交事務(wù)

?

使用樂觀鎖時,可以在表中添加一個字段:version。

但讀數(shù)據(jù)時,連同version一同讀出。在update時,將version+1,然后與數(shù)據(jù)庫中的version比較。如果大于數(shù)據(jù)庫中的版本,執(zhí)行update。如果等于或小于數(shù)據(jù)庫中的version,那么就是臟數(shù)據(jù)。不執(zhí)行。

數(shù)據(jù)庫事務(wù)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論