中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于MySQL的事務隔離簡略介紹

發布時間:2020-04-07 11:23:10 來源:億速云 閱讀:109 作者:小新 欄目:MySQL數據庫

今天小編給大家分享的是關于MySQL的事務隔離簡略介紹,很多人都不太了解,今天小編為了讓大家更加了解MySQL的事務隔離,所以給大家總結了以下內容,一起往下看吧。一定會有所收獲的哦。

關于MySQL的事務隔離簡略介紹

事務的介紹

事務就是一組原子性的sql查詢,或者說是一個獨立的工作單元。簡而言之,事務內的語句要么全部執行成功,要么全部執行失敗。

在Mysql中,事務支持是在引擎層實現的,但并不是所有的Mysql引擎都支持事務,比如MyISAM引擎就不支持事務,這也是MyISAM被InnoDB取代的重要原因之一。

提到事務,我們肯定會想到ACID:

  • 原子性(Atomicity)

  • 一致性(Consistency)

  • 隔離性(Isolation)

  • 持久性(Durability)

隔離級別

當數據庫中有多個事務同時執行時,就可能會出現臟讀、不可重復讀、幻讀等問題,因為就有了事務隔離級別的概念。

SQL標準正定義了四種隔離級別:

  1. READ UNCOMMITTED (未提交讀)

    事務中的修改,即使還沒有提交,對其他事務都是可見的。事務可以讀取未提交的數據,也被稱為臟讀(Dirty Read)。

  2. READ COMMITTED(提交讀)

    一個事務提交后,所做的變更才能被其他事務看到。這個級別也叫不可重復讀,因為事務中執行2次相同的查詢,可能得到的結果是不一樣的。

  3. REPEATABLE READ(可重復讀)

    一個事務執行的過程中,總是和這個事務在啟動時看到的數據是一致的。當然在這個級別下,未提交的數據變更對其他事務也是不可見的。

  4. SERIALIZABLE(可串行化)

    對同一行記錄,寫和讀都會加鎖,當出現讀寫鎖沖突時,后訪問的事務必須等前一個事務執行完成才能繼續執行,就會導致大量的超時和鎖爭用的問題。

在實現上,數據庫里面會創建一個視圖,訪問的時候以視圖的邏輯為準。

在可重復讀這個隔離級別下,這個視圖是事務開啟的時候創建的,整個事務期間都用這個視圖。

在讀提交的隔離級別下,這個視圖是在sql語句開始執行的時候創建的。

在讀未提交的隔離級別下,直接返回記錄上的最新值,沒有視圖概念。

在串行化的隔離級別下,直接用加鎖的方式避免并行訪問。

配置的方式是將啟動參數transaction-isolation設置成想要的隔離級別。

關于MySQL的事務隔離簡略介紹

查看當前設置:

mysql> show variables like 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

總之,存在即合理,不同的隔離級別適用于不同的場景,具體我們應該根據業務場景來決定。

事務隔離的實現

在Mysql中,實際上每條記錄的更新同時也會記錄一條回滾操作,記錄上的最新值通過回滾操作,都可以得到前一個狀態的值。

系統會自動判斷,當沒有事務再需要回滾日志時,會刪除回滾日志。

為什么不建議使用長事務:

長事務意味著系統里面會存在很老的事務視圖,由于這些事務隨時可以訪問數據庫里面的任何數據,所以這個事務提交之前,數據庫里可能用到的回滾記錄必須保留著,這就會占用大量的存儲空間。同時長事務還占用鎖資源,也可能拖垮整個庫。

事務啟動的方式

  • 顯式啟動事務語句,begin或者start transaction,提交就是commit,回滾用rollback。

  • set autocommit = 0,這個命令會將線程的自動提交關掉,意味著如果執行一個select 語句,這個事務就啟動了,并且不會自動提交,直到你主動執行commit或者rollback,或者斷開連接。

個人建議還是通過第一種方式顯式啟動事務,避免長事務的發生。

在 set autocommit = 1 的情況下,用 begin 顯式啟動的事務,如果執行 commit 則提交事務。如果執行 commit work and chain,則是提交事務并自動啟動下一個事務,這樣也省去了再次執行 begin 語句的開銷。

查詢長事務:

下面語句是查詢持續時間超過60s的事務

mysql> select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;
Empty set (0.00 sec)

總結下來,我們在開發過程中,盡量少用長事務,如果無法避免,保證邏輯日志空間足夠大,并且支持動態日志空間增長。監控Innodb_trx表,發現長事務報警。

以上就是關于MySQL的事務隔離的簡略介紹,當然詳細使用上面的不同還得要大家自己使用過才領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万山特区| 安龙县| 鸡东县| 昌宁县| 呼玛县| 宁武县| 红河县| 当涂县| 富川| 德钦县| 抚远县| 客服| 泰和县| 苗栗市| 东明县| 宜君县| 沿河| 邮箱| 正宁县| 黄陵县| 台中县| 保定市| 玉环县| 柘荣县| 旌德县| 微博| 琼中| 若尔盖县| 富川| 色达县| 望江县| 尉犁县| 广东省| 永丰县| 五家渠市| 波密县| 宁陵县| 依兰县| 阿合奇县| 宝应县| 天全县|