mysql在執行sql語句的時候,會遇到一些場景,一系列操作必須全部執行,而不能僅執行一部分。例如,乙個轉賬操作:
-- 從id=1的賬戶給id=2的賬戶轉賬100元
-- 第一步:將id=1的a賬戶餘額減去100
update accounts set balance = balance -
100where id =1;
-- 第二步:將id=2的b賬戶餘額加上100
update accounts set balance = balance +
100where id =
2;
這兩條sql語句必須全部執行,或者,由於某些原因,如果第一條語句成功,第二條語句失敗,就必須全部撤銷。這種把多條語句作為乙個整體進行操作的功能,被稱為資料庫事務。
資料庫事務可以確保該事務範圍內的所有操作都可以全部成功或者全部失敗。如果事務失敗,那麼效果就和沒有執行這些sql一樣,不會對資料庫資料有任何改動。
所以,資料庫事務具有acid這4個特性:
多個事務,同時提交的話,如果序列執行,則會造成事務的響應時間過長,使用者體驗極差,所以
同時提交的事務,是併發執行的。
對多個併發事務如果不加以控制,則可能會造成一下四種問題
併發操作會帶來資料的不一致性,包括髒讀、不可重複讀、幻讀等。資料庫系統提供了隔離級別來讓我們有針對性地選擇事務的隔離級別,避免資料不一致的問題。mysql innodb
主要有一下四種隔離級別
隔離級別
髒讀不可重複讀
幻讀未提交讀(read uncommitted)
可能可能
可能已提交讀(read committed)
不可能可能
可能可重複讀(repeatable read)
不可能不可能
可能可序列化(serializable)
不可能不可能
不可能事務併發控制比較複雜,先占個坑,之後更新。
廖雪峰對事務的介紹
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...
mysql事務隔離級別詳解 事務的隔離級別詳解
事務的隔離級別 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。問題的提出 資料庫是要被廣大客戶所共享訪問的,那麼在資料庫操作過程中很可能出現以下幾種不確定情況。更新丟失 兩個事務都同時更新一行資料,乙個事務對資料的更新把另乙個事務對資料的更新覆蓋了。這是因為系統沒有執行任何的...
MySQL事務隔離級別
sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...