事務就是保證一組資料庫操作,要麼全部成功,要麼全部失敗。mysql,事務支援是在引擎層實現的。
資料庫多個事務同時執行,可能出現髒讀(dirty read)/不可重複讀(non-repeatable read)/幻讀(phantom read)的問題。為了解決這些問題,就有了「隔離級別」的概念。
讀未提交(read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(serializable)。
讀未提交:事務還沒提交,可能被別的事務看到
讀提交:事務提交後,才會被其他事務看到
可重複讀:事務執行過程看到的資料,和這個事務啟動時看到的是一樣的。
序列化:對同一行記錄,「寫」會加「寫鎖」,「讀」加「讀鎖」。後訪問的事務必須等前乙個事務執行完成,才能繼續。
讀未提交:v1 = 2 v2 = 2 v3 = 2
讀提交:v1 = 1 v2 = 2 v3 = 2
可重複讀:v1 = 1 v2 = 1 v3 = 2
序列化:事務b被鎖住,直到a執行完後才繼續執行。v1 = 1 v2 = 2 v3 = 2
「讀未提交」直接返回記錄上的最新值,而「序列化」直接用加鎖的方式來避免並行訪問。
oracle資料庫的預設隔離級別就是「讀提交」。將mysql的隔離級別設定為「讀提交」。
mysql> show variables like 'transaction_isolation';
+-----------------------+----------------+
| variable_name | value |
+-----------------------+----------------+
| transaction_isolation | read-committed |
+-----------------------+----------------+
重點說明「可重複讀」
mysql每條記錄更新的時候會同時記錄一條回滾操作。記錄上面的最新值,通過回滾,都可以得到前乙個的狀態。
假設乙個值1被按順序改為了2/3/4,回滾日誌
當系統裡沒有比這個回滾日誌更早的read-view的時候,刪除這個回滾日誌。
盡量不要使用長事務。長事務意味著系統裡會存在很多很老的事務檢視。這個事務提交前,資料庫裡它可能用到的回滾記錄都必須保留,這就導致大量占用儲存空間。
長事務還占用鎖資源,也可能拖垮整個庫。
有下面幾種:
1.顯式啟動事務語句,begin 或 start transcation。提交語句是commit。回滾語句是rollback。
2.set autocommit=0 會將執行緒的自動提交關掉。如果只執行乙個select,事務就啟動了。直到commit或rollback,或者斷開連線。
有些客戶端會預設連線成功後先執行乙個set autocommit=0,導致接下來的查詢都在事務中,如果是長連線,就導致了意外的長事務。
所以建議set autocommit=1,通過顯示語句來啟動事務。
commit work and chain提交事務並自動啟動下乙個事務,省去了再次執行begin語句的開銷。
你可以在 information_schema 庫的 innodb_trx這個表中查詢長事務。
比如查詢持續時間超過60秒的事務:
select * from information_schema.innodb_trx where time_to_sec(timediff(now(),trx_started))>60
如何避免長事務對業務的影響?
從應用開發端和資料庫端來看。
首先,從應用開發端來看:
1、確認是否使用了set autocommit=0。這個確認工作可以在測試環境中展開。把sql的general_log開起來,然後隨便跑乙個業務邏輯,通過general_log的日誌來確認。
2、確認是否有不必要的唯讀事務。
3、通過set max_execution_time命令,來控制每個語句執行的最長時間,避免單個語句意外執行太長時間。
從資料庫端來看:
1、監控 information_schema.lnnodb_trx表,設定長事務閾值,超過就報警/或者kill
2、percona的pt-kill這個工具不錯
3、在業務功能測試階段輸出所有的general_log,分析日誌行為
4、mysql5.6或者更新版本,把innodb_undo_tablespaces設定成2(或更大的值)。如果真的出現大事務導致回滾段過大,這樣設定後清理起來更方便。
學習Mysql事務筆記
l事務的概念 事務指邏輯上的一組操作,組成這組操作的各個單元,要不全部成功,要不全部不成功。例如 a b轉帳,對應於如下兩條sql語句 update from account set money money 100 where name b update from account set money...
Mysql 事務學習筆記
當乙個人在update這個資料,另乙個人在select查詢這個資料的時候.會產生一種資料混亂,應運產生的鎖.鎖策略,就是在鎖的開銷和資料的安全性做出平衡.大部分商業資料庫並沒有提供特別多選擇,只是在表上加上行級鎖.事務是一組原子性的sql查詢,如果能執行查詢全部語句,那麼查詢全部,如果又一條語句不成...
Mysql筆記(三) Mysql的事務
一 資料庫事務 1 資料庫事務 簡稱 事務 是資料庫管理系統執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。簡單而言就是要保證一組資料可以操作,要麼全部成功,要嘛全部失敗。2 資料庫事務的特性 資料庫事務擁有以下四個特性,習慣上被稱之為acid特性。原子性 atomicity 事務作為乙個...