MySQL事務:一組原子性的SQL查詢,或者說一個獨立工作單元 一個支持事務的存儲引擎或者關係型資料庫必然滿足ACID測試 A:atomicity,原子性;整個事務中的所有操作要麼全部成功執行,要麼全部失敗後回滾 C:consistency, 一致性;資料庫總是從一個一致性狀態轉換為另一個一致性狀態 ...
MySQL事務:一組原子性的SQL查詢,或者說一個獨立工作單元
一個支持事務的存儲引擎或者關係型資料庫必然滿足ACID測試
A:atomicity,原子性;整個事務中的所有操作要麼全部成功執行,要麼全部失敗後回滾
C:consistency, 一致性;資料庫總是從一個一致性狀態轉換為另一個一致性狀態
I:Isolation,隔離性;一個事務所做出的操作在提交之前,是不能為其它所見;隔離有多種隔離級別
D:durability: 持久性;一旦事務提交,其所做的修改會永久保存於資料庫中
事務生命周期:啟動事務START TRANSACTION-->執行sql語句-->結束事務:(1) COMMIT:提交 或者 (2) ROLLBACK: 回滾
註意:只有事務型存儲引擎方能支持此類操作
autocommit | ON 每條sql語句當作一個事務自動提交(這會影響系統i/o性能)
建議:顯式請求和提交事務,而不要使用“自動提交”功能 set autocommit=0
事務支持savepoint
SAVEPOINT identifier 例如:savepoint sp1 savepoint sp2
ROLLBACK [WORK] TO [SAVEPOINT] identifier 例如:rollback to sp2
RELEASE SAVEPOINT identifier 例如:release savepoint sp1
事務隔離級別:
READ UNCOMMITTED (讀未提交): 另一個事務修改了數據,但尚未提交,而本事務中的SELECT會讀到這些未被提交的數據(臟讀)
READ COMMITTED (讀提交): 本事務讀取到的是其他事務提交後的最新數據。問題是在同一個事務里,如果其他事務修改兩次當前事務前後兩次相同的SELECT會讀到不同的結果(不重覆讀)
REPEATABLE READ (可重讀):在同一個事務里,SELECT的結果是事務開始時間點的狀態,因此,同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象
SERIALIZABILE (可串列化):一個事務未提交時,另一個事務對同一數據做操作時會被阻塞
存在的問題:臟讀(另一個事務修改了數據,但尚未提交,而本事務中的SELECT會讀到這些未被提交的數據)
不可重覆讀(解決了臟讀後,會遇到,同一個事務執行過程中,另外一個事務提交了新數據,因此本事務先後兩次讀到的數據結果會不一致)
幻讀(解決了不可重覆讀,保證了同一個事務里,查詢的結果都是事務開始時的狀態(一致性)但是如果另一個事務同時提交了新數據例如30改為40,這時在底層看到同一數據有30和40兩個值)
加鎖讀:當在高併發時,可能會導致一場噩夢,不過最大限度地提高了數據的安全性
查看隔離級別:
死鎖:兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去,解決死鎖主要針對於最常用的InnoDB
查看事務日誌:
innodb_log_buffer_size 緩存中事務日誌的大小
innodb_log_file_size 磁碟事務日誌文件大小
innodb_log_files_in_group 幾個事務日誌文件
innodb_log_group_home_dir 事務日誌文件存放位置
事務日誌文件名:
以上幾個參數不支持運行時修改,需要修改配置文件並從新啟動