數據庫事物樂觀鎖和悲觀鎖 數據庫事物單個邏輯單元工作執行的一系列操作,就是一些sql語句,也可以是多條,一個update操作就是一個事物。 事物具有四種特性 1.原子性 事物必須是原子工作單元,要么都執行成功(也就是說所有的sql語句都執行成功),要么都不
數據庫事物樂觀鎖和悲觀鎖
數據庫事物單個邏輯單元工作執行的一系列操作,就是一些sql語句,也可以是多條,一個update操作就是一個事物。
事物具有四種特性
1.原子性
事物必須是原子工作單元,要么都執行成功(也就是說所有的sql語句都執行成功),要么都不執行(所有的sql語句都不執行)。
www.2cto.com
2. 一致性
事務在完成時,必須使所有的數據都保持一致狀態。
3.隔離性
允許多個用戶對數據進行并發訪問,而不破環數據的完整行和正確性,同時,并發事物的修改必須與其他并發事物隔離,一般是通過加鎖實現。
4.持久性
事物完成后,數據必須永久的保存到數據庫中。
事物并發訪問如果不設置事物的隔離級別,就會帶來如下問題
1.臟讀 讀取了其他事物未提交的數據,一個事物修改了某條數據還未提交,一個事物讀取了這條數據,而修改的事物由于某種原因失敗會滾了,這個時候讀取事物就讀到了臟數據。
2.不可重復讀
一個事物兩次讀取某條數據,但讀取的結果不一樣,在第二次讀取的時候其他實物修改了這條數據。
www.2cto.com
3.幻讀
一個事物兩次讀取,讀取到了其他事物插入到數據中的數據。
針對以上情況,數據庫提供了四種事物的隔離級別來解決事物并發帶來的問題。
1.讀未提交(read uncommited)
寫事物會阻塞寫事物,但不會阻塞讀取事物,因此不能解決讀取臟數據,讀取事物不會阻塞其他事物,這中隔離級別不能解決上面任何問題。
2 讀已經提交(read commited)
寫事物會阻塞寫事物和讀取事物,因此可以避免讀取臟數據,但讀取事物不會阻塞寫事物,不能解決可重復度去的問題。
3 可重復讀(Repeatable read)
讀事物會阻塞寫事物和讀事物,因此可以重復讀,但其他事物可以進行插入操作,不能解決幻讀的問題。
4 序列化(Serializable)
事物必須一個一個的執行 ,可以解決上面的問題,但事物基本沒有并發性。
事物的并發控制
當多個人并發修改同一條數據時,必須實現一個控制系統,使一個人的修改不會對其他人的修改造成負面影響。
樂觀鎖和悲觀鎖控制并發
1.樂觀鎖
樂觀的認為其他用戶企圖訪問和更改你正在訪問的對象的概率很低,即使有,大不了從來一次,對在做一次的開銷不是很大的情況下,如果開銷很大則必須使用悲觀鎖.樂觀鎖的實現需要在程序中控制,可以通過加一個數據版本號來控制比如兩個事物都讀取了同一條記錄要進行更新
Sql代碼
select * from person
select * from person
update person set name='xiaoming',version=version+1 where id='1'
and version=0;
這個更新語句會執行失敗,因為找不到版本好為0的數據,第一個事物已經更新了
pdate person set name='xiaoming',version=version+1 where id='1'
and version=0;
www.2cto.com
如果實物的隔離級別設置為讀已提交,使用樂觀鎖并能解決可重復度,系統要允許不可重復讀取。
悲觀鎖
很悲觀的認為其他用戶訪問和更改你正在訪問或修改的對象的概率和高,悲觀鎖的實現是通過加鎖來實現的,當要更改數據前就加鎖,別的事物不能操作,sql語句如下
Sql代碼
select * from person for update
update person set name='ff' where id='1'
直到上面事物提交,才能釋放鎖,其他事物才能操作。悲觀鎖的并發性會降低。因此大多數情況下,使用樂觀鎖來實現并發修改。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com