MySQL資料庫併發與事務相關問題

2021-10-09 09:17:04 字數 1471 閱讀 2408

大多數商業資料庫系統一般都是在表上施加行級鎖。

事務就是一組原子性的sql查詢,事務內的語句,要麼全部執行成功,要麼全部執行失敗。

隔離級別

髒讀不可重複讀

幻讀read uncommitted√√

√read committed×√

√repeatable read××

√serializable××

×兩個或多個事務在同乙個資源上相互占用,請求鎖定對方占用的資源,從而導致惡行迴圈的現象。innodb目前處理死鎖的方法是,將持有最少行級排他鎖的事務進行回滾。

mvcc(multi-version concurrency control)是行級鎖的一種變種,但它在很多情況下避免了加鎖操作,因此開銷更低,不同儲存引擎對mvcc的實現有所不同,但大都實現了非阻塞的讀操作,寫操作也只鎖定必要的行。mvcc 是現代資料庫(包括mysqloraclepostgresql等)引擎實現中常用的處理讀寫衝突的手段, 目的在於提高資料庫高併發場景下的吞吐效能

如此一來不同的事務在併發過程中,select操作可以不加鎖而是通過mvcc機制讀取指定的版本歷史記錄,並通過一些手段保證保證讀取的記錄值符合事務所處的隔離級別,從而解決併發場景下的讀寫衝突。

innodb的mvcc是通過在每行記錄後面儲存兩個隱藏的列實現的,乙個儲存了行的建立時間data_trx_id,乙個儲存了行的過期時間(刪除時間)data_roll_ptr,如果插入的行沒有設定主鍵,則會多乙個隱藏的主鍵列db_row_id

儲存這兩個額外的系統版本號,使大多數讀操作都不用加鎖。mvcc只在rrrc兩個隔離級別下工作,其他兩個隔離級別用不到mvcc,因為ru總是讀取最新的資料行,serializable則會對所有讀取的行都加鎖。

組織版本鏈

在多個事務並行操作某行資料的情況下,不同事務對該行資料的update會產生多個版本,然後通過回滾指標組織成一條undo log鏈,下圖是乙個由id為10的事務建立的一行sher資料,然後由id為20的事務將該行資料更新為sher6,然後id為30的事務將該行資料更新為sher6j。這樣的話,就可以根據data_roll_ptr指標檢視以前的版本,並可以進行回滾。

資料庫事務與併發

資料庫事務必須具備acid特徵 1 原子性 指整個資料事務是不可分割的工作單元。只有事務中所有操作執行成功,才算整個事務成功 事務中任何乙個sql語句執行失敗,那麼已經執行成功的sql語句也必須撤銷,資料庫狀態應該退回到執行事務前的狀態。2 一致性 指資料庫事務不能破壞關係資料的完整性以及業務邏輯上...

MySql資料庫事務相關

mqlsql的事務是由儲存引擎所決定的,比如myisam,memory,archive都不支援事務,而事務的存在則保證了一組查詢要麼全部成功,要麼全部失敗。mysql的事務採取的是自動提交的模式,除非顯示開始乙個事務修改自動提交模式,值得注意的是,修改自動提交對非事務型別的表是無效的,因為它們本身不...

資料庫事務與併發 Hibernate

資料庫事務中的基本概念 資料庫事務是指,由乙個或多個sql語句組成的工作單元,這個工作單元中的sql語句相互依賴,如果有乙個sql語句失敗,那麼整個操作都要撤銷。在併發環境中,當多個事務同時訪問同一資源時,可能會造成併發問題,此時可以使用資料庫系統的事務隔離級別來避免各類併發問題。此外,在應用程式中...