MqlSQL的事務是由存儲引擎所決定的,比如MYISAM,MEMORY,ARCHIVE都不支持事務,而事務的存在則保證了一組查詢要麼全部成功,要麼全部失敗。mySql的事務採取的是自動提交的模式,除非顯示開始一個事務修改自動提交模式,值得注意的是,修改自動提交對非事務類型的表是無效的,因爲它們本身不存在提交和回滾的概念,還有一些命令則是強制自動提交的,如DLL命令、lock table等。
(SHOW VARIABLES LIKE ‘AUTOCOMMIT’
SET AUTOCOMMIT = OFF 或 SET AUTOCOMMIT = 0)
原子性(Atomic)
整個事務包含的所有操作要麼全部執行要麼全不執行,失敗回滾
一致性(Consistent)
數據能夠滿足完整性約束,兩個關聯的數據一個改變另一個也隨之改變(一致狀態)
隔離性(Isolation)
是指多個事務編髮執行操作時一個事務的執行不應該影響其他事務的執行
這種屬性有時稱爲串行化,爲了防止事務操作之間的混淆,必須串行化或序列請求,使得在同一時間僅有同一請求用於同一數據
持久性(Durability)
一個事務的提交,它對數據庫的修改應該永久保存到數據庫中,持久性意味着當系統或者介質發生故障時,確保已提交的事務的更新不丟失,可以恢復一個事務被提交
事務隔離級別以及各級別下的併發訪問問題
MySQL會利用鎖機制創造出不同的事務隔離級別
四種事務隔離級別
讀未提交(READ UNCOMMITTED):未提交讀也叫讀髒,就是事務可以讀取其他事務未提交的數據
讀已提交(READ COMMITTED):在其他數據庫系統比如SQLSERVER默認的隔離級別就是提交讀,已提交讀就是在事務未提交之前所做的修改其他事務是不可見的
可重複讀(REPEARABLE READ):保證同一事務中多次相同的查詢結果是一致的,比如一個事務一開始查詢了一條記錄然後過了幾秒鐘又執行了相同的查詢,保證兩次查詢結果是相同的,此隔離級別也是mySQL默認隔離級別。
可串行化(SERIALIZABLE):可串行化就是保證讀取的範圍內沒有新的數據插入,比如事務第一次查詢得到的某個數據範圍,第二次查詢也同樣得到了相同的結果,中間並沒有新的數據插入到該範圍中。
併發訪問問題
1.更新丟失—MySQL所有的事務隔離級別在數據庫層面上均可避免
2.髒讀—READ-COMMITED事務隔離級別以上均可避免(已提交讀)oracle默認級別
3.不可重複讀—事務A在多次讀取同一數據的過程中,事務B對數據進行更新並提交,導致事務A多次讀取到同一數據時結果不一致
4.幻讀—事務A讀取若干行數據,事務B以插入或刪除行的方式來修改事務A的結果集