MySQL鎖釋放時機 事務

2021-09-05 12:15:52 字數 1505 閱讀 5155

在事務執行過程中,如果有加鎖操作,這個鎖需要等事務提交時釋放。

時間線事務1 (t1)

事務2(t2)

t1begin;

begin;

t2update lockdemo set state = '666' where id = 2;

t3update lockdemo set state = '22' where id = 2;

t..select * from lockdemo;

select * from lockdemo;

t..commit;

commit;

事務1在t2時刻先執行更新操作,它就會一直持有id=2的鎖直到commit;事務2在t3時刻獲取會失敗。

begin;

update lockdemo set state = '666' where id = 2;

select * from lockdemo;

commit;

begin;

update lockdemo set state = '22' where id = 2;

select * from lockdemo;

commit;

死鎖是指兩個或多個事務在同乙個資源上相互占用,並請求鎖定對方占用的資源,從而導致惡性迴圈的現象.當多個事務試圖以不同的順序鎖定資源時,就可能會產生死鎖,多個事務同時鎖定同乙個資源時,也會產生死鎖。

例如:事務1:

start transaction;

update stock_price set close = 45.50 where stock_id = 4 and date = '2017-4-26';

update stock_price set close = 19.80 where stock_id = 3 and date = '2017-4-27';

commit;

事務2:

start transaction;

update stock_price set high = 20.10 where stock_id = 3 and date = '2017-4-27';

update stock_price set high = 47.20 where stock_id = 4 and date = '2017-4-26';

commit;

如果湊巧,兩個事務均執行了第一條update語句,同時鎖定了該資源,當嘗試執行第二條update語句的時候,去發現資源已經被鎖定,兩個事務都等待對方釋放鎖,則陷入死迴圈,形成死鎖。

為了解決這種問題,資料庫系統實現了各種死鎖檢測和死鎖超時機制.比如innodb儲存引擎目前的處理方法是將持有最少級排他鎖的事務進行回滾.

mysql事務與鎖機制 mysql事務與鎖機制

在併發下事務會容易出現的一些問題 資料更新丟失 兩個事務同時操作一條資料,乙個事務因為異常導致資料更新丟失 髒讀 乙個失誤開始讀取了某行資料,另外乙個事務已經更新了此資料但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。不可重複讀 乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的...

mysql 事務和鎖

事務是dbms得執行單位 開啟事務 set autocommit 0 取消自動提交 或begin 手動開啟乙個事務 提交乙個事務 commit 回滾乙個事務 rollback 在mysql的innodb 引擎中,預設每個操作 insert,update,select for update lock ...

MySQL 事務和鎖

和其他資料庫相比,mysql的鎖機制比較假單,不同的引擎支援不同的鎖機制。myisam和memory使用表級鎖,bdb使用頁面鎖和表級鎖 innodb預設支援行級鎖,也支援表級鎖。myisam表鎖有兩中,乙個是都鎖,乙個是寫鎖,相容性如下 模式讀鎖 寫鎖讀鎖 相容不相容 寫鎖不相容 不相容 可見my...