日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

同一事务中未提交的写能读到吗_03、MySQL事务的隔离性分析

發布時間:2025/3/12 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 同一事务中未提交的写能读到吗_03、MySQL事务的隔离性分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
事務可以用來保證數據庫的完整性:要么都做,要么不做。在 MySQL 中,事務支持是在引擎層實現的。你現在知道,MySQL 是一個支持多引擎的系統,但并不是所有的引擎都支持事務。比如 MySQL 原生的 MyISAM 引擎就不支持事務,這也是 MyISAM 被 InnoDB 取代的重要原因之一。事務的特性(ACID)
  • 原子性,是指整個數據庫的每個事務都是不可分割的單位。只有事務中的所有 SQL 語句都執行成功,才算整個事務成功,事務才會被提交。如果事務中任何一個 SQL 語句執行失敗,整個事務都應該被回滾。
  • 一致性,是指將數據庫從一種一致性狀態轉換為下一種一致性狀態。不允許數據庫中的數據出現新老數據都有的情況,要么都是老數據,要么都是新數據。用更書面化的表達就是:數據的完整性約束沒有被破壞。
  • 隔離性,是指一個事務的影響在該事務提交前對其他事務都不可見,它通過鎖機制來實現。
  • 持久性,是指事務一旦被提交,其結果就是永久性的。即使發生宕機等故障,數據庫也能將數據恢復。
  • 事務的語法
    • 在 MySQL 命令行的默認設置下,事務是自動提交的,即執行了SQL 語句之后會馬上執行 commit 操作,我們可以設置 set autocommit=0 來禁用當前回話的自動提交。
    • 還可以用 begin 、start transaction 來顯式的開始一個事務。
    • commit 在默認設置下是等價于 commit work 的,表示提交事務。
    • rollback 在默認設置下等價于 rollback work,表示事務回滾。
    • savepoint xxx 表示定義一個保存點,在一個事務中可以有多個保存點。
    • release savepoint xxx 表示刪除一個保存點,當沒有該保存點的時候執行該語句,會拋出一個異常。
    • rollback to [savepoint] xxx 表示回滾到某個保存點。
    --查詢事務自動提交狀態show variables like '%commit%';+-----------------------------------------+-------+| Variable_name | Value |+-----------------------------------------+-------+| autocommit | ON || binlog_group_commit_sync_delay | 0 || binlog_group_commit_sync_no_delay_count | 0 || binlog_order_commits | ON || innodb_api_bk_commit_interval | 5 || innodb_commit_concurrency | 0 || innodb_flush_log_at_trx_commit | 1 || slave_preserve_commit_order | OFF |+-----------------------------------------+-------+--全局修改set?global?autocommit=0;--局部修改set session autocommit=0;--查看修改情況show global variables like 'autocommit';事務隔離級別類型以及序列化介紹事務的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個并發事務之間要相互隔離。在并發下事務會容易出現一些問題:
    • 臟讀 :一個事務開始讀取了某行數據,另外一個事務已經更新了此數據但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。
    • 不可重復讀:一個事務對同一行數據重復讀取兩次,但是卻得到了不同的結果。例如,在兩次讀取的中途,有另外一個事務對該型數據進行了修改,并提交。
    • 幻讀:事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的數據(MySQL8已解決該問題)。
    ????????這是因為在兩次查詢過程中有另外一個 事務插入數據在MySQL中存在(InnoDB)事務存在著4中隔離級別,不同的隔離級別對事務的處理不同。
    • 讀未提交(?Read Uncommitted)

      READ-UNCOMMITTED | 0:

      存在臟讀,不可重復讀,幻讀的問題。

      如果一個事務已經開始寫數據,則另外一個數據則不會允許同時進行寫操作,但允許其他事務讀此行數據。

      隔離級別可以通過“排他寫鎖”實現。

    • 讀已提交(?Read committed):READ-COMMITTED | 1:解決臟讀的問題,存在不可重復讀,幻讀的問題。這個可以通過“排他寫鎖”實現。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。
    • 可重復讀取(Repeatable Read):REPEATABLE-READ | 2:解決臟讀,不可重復讀的問題,存在幻讀的問題,默認隔離級別。可通過“共享鎖”,“排他鎖”實現。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
    • 序列化(Serializable):SERIALIZABLE | 3:解決臟讀,不可重復讀,幻讀,可保證事務安全,但完全串行執行,性能最低。提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,不能并發執行。如果僅僅通過“行級鎖”是無法實現事務序列化的,必須要通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。
    隔離級別讀數據一致性不可重復讀幻讀
    讀未提交?
    Read Uncommitted
    最低級別,只能保證不讀取物理上損壞的數據
    讀已提交?
    Read committed
    語句級
    可重復讀取
    Repeatable Read
    事務隔離級別
    序列化
    Serializable
    最高級別,事務級
    --查看當前隔離級別SHOW?VARIABLES?LIKE?'%transaction_isolation%';+-----------------------+------------------+| Variable_name | Value |+-----------------------+------------------+| transaction_isolation | REPEATABLE-READ |+-----------------------+------------------+-- 設定全局的隔離級別 設定會話 global 替換為 session 即可 把set語法溫習一下-- SET [GLOABL] config_name = 'foobar';-- SET @@[session|global].config_name = 'foobar';-- SELECT @@[global.]config_name;--全局修改SET @@gloabl.transaction_isolation = 0;SET @@gloabl.transaction_isolation = 'READ-UNCOMMITTED';SET @@gloabl.transaction_isolation = 1;SET @@gloabl.transaction_isolation = 'READ-COMMITTED';SET @@gloabl.transaction_isolation = 2;SET @@gloabl.transaction_isolation = 'REPEATABLE-READ';SET @@gloabl.transaction_isolation = 3;SET @@gloabl.transaction_isolation = 'SERIALIZABLE';--局部修改SET @@session.transaction_isolation = 0;SET @@session.transaction_isolation = 'READ-UNCOMMITTED';SET @@session.transaction_isolation = 1;SET @@session.transaction_isolation = 'READ-COMMITTED';SET @@session.transaction_isolation = 2;SET @@session.transaction_isolation = 'REPEATABLE-READ';SET @@session.transaction_isolation = 3;SET @@session.transaction_isolation = 'SERIALIZABLE';實例分析假設數據表 T 中只有一列,其中一行的值為 1,下面是按照時間順序執行兩個事務的行為。
    • 若隔離級別是“讀未提交”, 則 V1 的值就是 2。這時候事務 B 雖然還沒有提交,但是結果已經被 A 看到了。因此,V2、V3 也都是 2。
    • 若隔離級別是“讀提交”,則 V1 是 1,V2 的值是 2。事務 B 的更新在提交后才能被 A 看到。所以, V3 的值也是 2。
    • 若隔離級別是“可重復讀”,則 V1、V2 是 1,V3 是 2。之所以 V2 還是 1,遵循的就是這個要求:事務在執行期間看到的數據前后必須是一致的。
    • 若隔離級別是“串行化”,則在事務 B 執行“將 1 改成 2”的時候,會被鎖住。直到事務 A 提交后,事務 B 才可以繼續執行。所以從 A 的角度看, V1、V2 值是 1,V3 的值是 2。

    Innodb的一條事務日志共經歷4個階段:

    • 創建階段:事務創建一條日志;
    • 日志刷盤:日志寫入到磁盤上的日志文件;(ib_logfile里面)
    • 數據刷盤:日志對應的臟頁數據寫入到磁盤上的數據文件;
    • 寫CKP:日志被當作Checkpoint寫入日志文件;(ib_data里面)

    總結

    以上是生活随笔為你收集整理的同一事务中未提交的写能读到吗_03、MySQL事务的隔离性分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。