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

數據庫事務隔離級別與鎖

系統 2518 0

一,事務的4個基本特征

Atomic(原子性):
事務中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要
么全部成功,要么全部失敗。

Consistency(一致性):
只有合法的數據可以被寫入數據庫,否則事務應該將其回滾到最初
狀態。

Isolation(隔離性):
事務允許多個用戶對同一個數據進行并發訪問,而不破壞數據的正
確性和完整性。同時,并行事務的修改必須與其他并行事務的修改
相互獨立。

Durability(持久性):
事務結束后,事務處理的結果必須能夠得到固化。

以上屬于廢話

二,為什么需要對事務并發控制

如果不對事務進行并發控制,我們看看數據庫并發操作是會有那些異常情形

更新丟失Lost update:
兩個事務都同時更新一行數據,但是第二個事務卻中途失敗退出,
導致對數據的兩個修改都失效了。

臟讀Dirty Reads:
一個事務開始讀取了某行數據,但是另外一個事務已經更新了此數
據但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作
都被回滾。

不可重復讀Non-repeatable Reads:
一個事務對同一行數據重復讀取兩次,但是卻得到了不同的結果。

二次更新問題Second lost updates problem:
無法重復讀取的特例。有兩個并發事務同時讀取同一行數據,然后其
中一個對它進行修改提交,而另一個也進行了修改提交。這就會造成
第一次寫操作失效。

不可重復讀Phantom Reads:
事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查
詢中未出現的數據(這里并不要求兩次查詢的SQL語句相同)。這是
因為在兩次查詢過程中有另外一個事務插入數據造成的。

三, 數據庫的隔離級別

為了兼顧并發效率和異常控制,在標準SQL規范中,定義了4個事務隔
離級別,(ORACLE和SQLSERER對標準隔離級別有不同的實現 )

事務準備接受不一致數據的級別稱為隔離級別。隔離級別是一個事務必須與其它事務進行隔離的程度。較低的隔離級別可以增加并發,但代價是降低數據的正確性。相反,較高的隔離級別可以確保數據的正確性,但可能對并發產生負面影響。應用程序要求的隔離級別確定了所使用的鎖定行為:

Read Uncommitted:
直譯就是"讀未提交",意思就是即使一個更新語句沒有提交,但是別
的事務可以讀到這個改變.這是很不安全的.

Read Committed:
直譯就是"讀提交",意思就是語句提交以后即執行了COMMIT以后
別的事務就能讀到這個改變.

Repeatable Read:
直譯就是"可以重復讀",這是說在同一個事務里面先后執行同一個
查詢語句的時候,得到的結果是一樣的.

Serializable:
直譯就是"序列化",意思是說這個事務執行的時候不允許別的事務
并發執行.

四,隔離級別對并發的控制


下表是各隔離級別對各種異常的控制能力。

? LU DR NRR SLU PR
RU Y Y Y Y Y
RC N N Y Y Y
RR N N N N Y
S N N N N N

?

?

?

?

?

?

?

?

?

(注:LU:丟失更新;DR:臟讀;NRR:非重復讀;SLU:二類丟失更新;PR:幻像讀)

順便舉一小例。

MS_SQL:
--事務一
set transaction isolation level serializable
begin tran
insert into test values('xxx')

--事務二
set transaction isolation level read committed
begin tran
select * from test

--事務三
set transaction isolation level read uncommitted
begin tran
select * from test

在查詢分析器中執行事務一后,分別執行事務二,和三。結果是事務二會等待,而事務三則會執行。

ORACLE:
--事務一
set transaction isolation level serializable;
insert into test values('xxx');
select * from test;

--事務二
set transaction isolation level read committed--ORACLE默認級別
select * from test

執行事務一后,執行事務二。結果是事務二只讀出原有的數據,無視事務一的插入操作。

讀者是否發現MS_SQL和ORACLE對并發控制的處理有所不同呢?

五,鎖

下表是鎖的兼容或沖突情形。

? 現有 S U X
申請 ? ? ? ?
S ? Y Y N
U ? Y N N
X ? N N N

?

?

?

?

?

?

?

?

?

oracle:

?

?? 數據庫事務隔離級別與鎖

?

六,隔離級別與鎖

隔離級別越高越能保證數據完整性和一致性,但是對并發性能影響也越大。對于多數應用程序,可以優先考慮把數據庫系統隔離級別設為Read Committed ,它能夠避免臟讀取而且具有較好并發性能。盡管它會導致不可重復讀、虛讀和第二類丟失更新這些并發問題,在可能出現這類問題的個別場合,可以由應用程序采用悲觀鎖或樂觀鎖來控制 。

鎖(Lock) 是在多用戶環境下對資源訪問的一種限制。機制當對一個數據源加鎖后,此數據源就有了一定的訪問限制。我們就稱對此數據源進行了“鎖定”。在SQL Server中,可以對以下的對象進行鎖定:

數據行(Row):數據頁中的單行數據;
索引行(Key):索引頁中的單行數據,即索引的鍵值;
頁(Page):頁是SQL Server 存取數據的基本單位,其大小為8KB;
盤區(Extent):一個盤區由8 個連續的頁組成;
表(Table);
數據庫(Database)。


在SQL Server 中,鎖有兩種分類方法。
(1) 從數據庫系統的角度來看
鎖分為以下三種類型:

1.獨占鎖(Exclusive Lock)
獨占鎖鎖定的資源只允許進行鎖定操作的程序使用,其它任何對它的操作均不會被接受。執行數據更新命令,即INSERT、 UPDATE 或DELETE 命令時,SQL Server 會自動使用獨占鎖。但當對象上有其它鎖存在時,無法對其加獨占鎖。獨占鎖一直到事務結束才能被釋放。
2.共享鎖(Shared Lock)
共享鎖鎖定的資源可以被其它用戶讀取,但其它用戶不能修改它。在SELECT 命令執行時,SQL Server 通常會對對象進行共享鎖鎖定。通常加共享鎖的數據頁被讀取完畢后,共享鎖就會立即被釋放。
3.更新鎖(Update Lock)
更新鎖是為了防止死鎖而設立的。當SQL Server 準備更新數據時,它首先對數據對象作更新鎖鎖定,這樣數據將不能被修改,但可以讀取。等到SQL Server 確定要進行更新數據操作時,它會自動將更新鎖換為獨占鎖。但當對象上有其它鎖存在時,無法對其作更新鎖鎖定。

?

2)從程序員的角度看
鎖分為以下兩種類型:

1.樂觀鎖(Optimistic Lock)

樂觀鎖對數據庫系統的自動管理不感冒,需要程序員直接管理數據或對象上的加鎖處理,并負責獲取、共享和放棄正在使用的數據上的任何鎖。

?

2.悲觀鎖(Pessimistic Lock)
悲觀鎖假定在處理數據時,不需要在應用程序的代碼中做任何事情就可以直接在記錄上加鎖、即完全依靠數據庫來管理鎖的工作。一般情況下,當執行事務處理時SQL Server會自動對事務處理范圍內更新到的表做鎖定。

?

?

鎖定優化程序提示及其描述
優化程序提示 優化程序提示描述
holdlock 保持鎖定直到事務結束
nolock 檢索數據時不使用鎖
paglock 使用頁面鎖
tablock 使用表鎖
tablockx 使用獨占表鎖
updlock 使用更新鎖

如: SELECT *??? FROM authors (paglock holdlock index=aunmind)??

?

?

死鎖及其防止:

死鎖(Deadlocking) 是在多用戶或多進程狀況下,為使用同一資源而產生的無法解決的爭用狀態,通俗地講,就是兩個用戶各占用一個資源,兩人都想使用對方的資源,但同時又不愿放棄自己的資源,就一直等待對方放棄資源,如果不進行外部干涉,就將一直耗下去。

死鎖會造成資源的大量浪費,甚至會使系統崩潰。在SQL Server 中解決死鎖的原則是“犧牲一個比兩個都死強”,即挑出一個進程作為犧牲者,將其事務回滾,并向執行此進程的程序發送編號為1205 的錯誤信息。而防止死鎖的途徑就是不能讓滿足死鎖條件的情況發生,為此,用戶需要遵循以下原則:

盡量避免并發地執行涉及到修改數據的語句;
要求每個事務一次就將所有要使用的數據全部加鎖,否則就不予執行;
預先規定一個封鎖順序所有的事務,都必須按這個順序對數據執行封鎖,例如,不同的過程在事務內部對對象的更新執行順序應盡量保持一致;
每個事務的執行時間不可太長,對程序段長的事務可考慮將其分割為幾個事務。

七,注意點

?

一般處理并發問題時的步驟:

1、開啟事務。

2、申請寫權限,也就是給對象(表或記錄)加鎖。

3、假如失敗,則結束事務,過一會重試。

4、假如成功,也就是給對象加鎖成功,防止其他用戶再用同樣的方式打開。

5、進行編輯操作。

6、寫入所進行的編輯結果。

7、假如寫入成功,則提交事務,完成操作。

8、假如寫入失敗,則回滾事務,取消提交。

9、(7.8)兩步操作已釋放了鎖定的對象,恢復到操作前的狀態。

?

對多表的操作最好一起取得鎖,或則保證處理順序;個人感覺還是前者好,雖然效率低一些


八,附
查看鎖
ORACLE:
select object_name,session_id,os_user_name,oracle_username,process,locked_mode,status
from v$locked_object l, all_objects a
where l.object_id=a.object_id;

MS_SQL:EXEC SP_LOCK

?

數據庫事務隔離級別與鎖


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久精品无码一区二区三区 | 亚洲精品一区二区卡 | 亚洲好色网 | 国产综合精品一区二区 | 亚洲成色| 久草首页在线观看 | 久久国内精品自在自线观看 | 91精品国产乱码久久久久久 | 日本韩国欧美在线 | 成人国产综合 | 亚洲国产精品久久 | 国产99视频精品一区 | 国产福利一区二区在线观看 | 国内精品久久久久丫网址 | 久久草在线视频播放 | 2级毛片| 欧美成人午夜做爰视频在线观看 | 国产你懂得| 色香视频在线 | 欧美国产亚洲精品高清不卡 | 最近中文2019视频在线 | 久久久久久亚洲精品不卡 | 国产精彩视频 | 久久精品国产大片免费观看 | 亚洲第一成年网 | 老扒夜夜春宵粗大好爽aa毛片 | 久久久国产99久久国产一 | 欧美日韩大尺码免费专区 | 精品伊人久久大香线蕉网站 | 久久久久久夜精品精品免费啦 | 看全色黄大色大片免费久久久 | 日日摸天天摸狠狠摸视频 | a毛片免费观看完整 | 午夜在线播放免费高清观看 | 欧美草逼视频 | 一级免费a | 免费特黄一级欧美大片在线看 | 成人欧美午夜视频毛片 | 精品国产第一国产综合精品 | 成年ssswww中国女人 | 日韩久草|