首頁  >  文章  >  資料庫  >  MySQL事務相關知識的詳細介紹(程式碼範例)

MySQL事務相關知識的詳細介紹(程式碼範例)

不言
不言轉載
2019-02-01 10:39:262662瀏覽

這篇文章帶給大家的內容是關於MySQL事務相關知識的詳細介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

MySQL交易以及交易隔離等級

MySQL交易主要用於處理操作量大,複雜度高的資料。例如在人員管理系統中,你刪除一個人員,你就要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等,這些資料庫操作語句就構成了一個事務(推薦課程: MySQL教學

    • MySQL中只有使用了Innodb資料庫引擎的資料庫或表格才支援交易

    • 交易處理可以用來維護資料庫的完整性,保證成批的SQL語句要麼全部執行,要麼全部不執行

    • #交易用來管理insert,update,delete語句

  • 一般來說,事務必須滿足4個條件:原子性,一致性,隔離性,持久性

    • 原子性:一個交易中所有操作,要麼全部執行,要麼全部不執行不會結束在中間某個環節。交易在執行過程中發生錯誤會被回滾到事務開始前的狀態

    • #一致性:在交易開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,包含資料的精確度,串聯性以及後續資料庫可以自發性的完成預定的工作

    • 隔離性:資料庫允許多個並發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致資料的不一致。交易隔離分為不同級別,包括讀取未提交內容,讀取提交內容,可重複讀取和可串行化

    • 持久化:交易處理結束後,資料的修改就是永久的,即使係統故障也不會遺失

#在MySQL命令列的預設是設定下,交易都是自動提交的,即執行SQL語句後就會馬上執行COMMIT操作。因此要明確的開啟一個交易需要使用指令BEGIN或START TRANSACTION,或執行指令SET AUTOCOMMIT=0,用來禁止使用目前繪畫的自動提交

交易控制語句:

  • BEGIN或START TRANSACTION;明確開啟一個交易

  • COMMIT;也可以使用COMMIT WORK,二者等價的。 COMMIT會提交事務,並使已對資料庫進行的所有修改成為永久性

  • #ROLLBACK;也可以使用ROLLBACK WORK,二者等價。 回滾會結束使用者的事務,並撤回正在進行的所有未提交的修改

  • #SAVEPOINT identifier;SAVEPOINT允許在交易中建立一個儲存點,一個事務可以有多個SAVEPOINT

  • RELESE SAVEPOINT identifier;刪除一個交易的保存點,當沒有指定的保存點時,執行該語句會拋出一個例外

  • ROLLBACK TO identified;把交易回滾到標記點

  • ##SET TRANSACTION ;用來設定交易的隔離等級。 InnoDB儲存引擎提供交易隔離等級有READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ和SERIALIZABLE

MySQL事務處理主要有兩種方法:

  1. ##MySQL事務處理主要有兩種方法:

  • 用BEGIN,ROLLBACK,COMMIT來實作

  • #BEGIN

    開始一個交易

  • ##ROLLBACK交易回滾

  • COMMIT

    交易確認
    • #直接SET來改變MySQL的自動提交模式:
    • SET AUTOCOMMIT=0禁止自動提交

    SET AUTOCOMMIT=1開啟自動提交
    1. 交易四大特性之一:隔離性
    2. #交易A跟交易B之間具有一定的隔離性
  • ##read uncommited 讀取未提交

    #########在該隔離級別,所有交易都可以看到其他未提交交易的執行結果。本隔離等級很少用於實際應用。讀取未提交的資料稱為髒資料###############read COMMIT###############大多數資料庫系統的預設隔離級別(但不是MySQL)。一個事務只能看見已經提交事務所的改變。其避免了髒讀,但仍存在不可重複讀和幻讀問題################repeatable read####
    • MySQL的預設層級;確保相同交易的多個實例在並發讀取資料時,會看到相同的資料行。避免了髒讀和不可重複讀,但是會導致另一個問題:幻讀。幻讀是指使用者讀取某一個範圍的資料行時,另一個事務又在該範圍插入了新行,當使用者再讀取該範圍的資料行時,會發現新的幻影行。 InnoDB和Falcon儲存引擎透過多版本並發控制(MVCC)機制解決了該問題

    • 可重複讀取的隔離等級下使用了MVCC機制,select操作不會更新版本號,是快照讀取(歷史版本);insert,update和delete會更新版本號,是目前讀取(目前版本)

  • serializable

    #最高隔離級別,透過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀取的資料行上加上共享鎖定。在這個級別,可能導致大量的超時現象和鎖定競爭

    1. 設定事務隔離級別

      在my.cnf檔案設置
    1. - READ-UNCOMMITTED
      - READ-COMMITED
      - REPEATABLE-READ
      - SERIALIZABLE
      * 例如
      [mysqlId]
      transaction-isolation = READ-COMMITTED

    透過命令動態設定隔離等級

    1. #
      SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>
      其中isolation-level可以是:
      - READ UNCOMMITTED
      - READ COMMITTED
      - REPEATABLE READ
      - SERIALIZABLE
      
      GLOBAL|SESSION表示事务隔离级别的作用范围:
      GLOBAL:表示对所有会话有效
      SESSION:表示对当前会话有效

      交易並發問題

    2. 髒讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取到的數據是髒數據

    3. 不可重複讀:事務A多次讀取到同一數據,事務B在事務A多次讀取過程中,對數據做了更新並未提交,導致事務A多次讀取同一條數據,結果不一致

    幻讀:前後讀取的結果資料條數不一致。這是因為在事務A的多次讀取過程中,事務B對錶進行插入或刪除操作

    ########## ###

    以上是MySQL事務相關知識的詳細介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除