在MySQL中,所有的DML操作在執行之後都會有一個commit操作[隱式的]
commit的意思就是用來提交事務.
DTL,數據事務語言
事務的定義:
就是指一組相關的SQL操作,我們所有的操作都是處在事務中的
注意:
-
在數據庫中**,執行業務的基本單位是事務,不是以某一條SQL**
-
數據庫在默認情況下,事務都是打開的,也就是說它是一直
-
處在事務中的,一個事務的結束,代表着下一個事務的開啓
-
執行commit或者rollback指令時,會結束當前事務
[已經提交的事務將不能夠被回滾]
作用:用來保證數據的平穩性和可預測性.
事務的四大特性(ACID):
-
atomic,原子性,事務是不可再分割的,要麼同時成功,要麼同時失敗
-
consistency,一致性,事務一旦結束,內存中的數據和數據庫中的數據是保持一致的.
-
isolation,隔離性,事務之間互不干擾,一個事務的結束意味着下一個事務的開啓
-
duration,持久性,事務一旦提交,則數據持久化到數據庫中,永久保存
[涉及到數據庫的備份和恢復的一些技術,冷備份,熱備份…]
事務控制語句
-
BEGIN或START TRANSACTION;顯式地開啓一個事務;
-
**COMMIT;**也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,並使已對數據庫進行的所有修改成爲永久性的;
-
**ROLLBACK;**有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束用戶的事務,並撤銷正在進行的所有未提交的修改;
-
SAVEPOINT identifier;SAVEPOINT允許在事務中創建一個保存點,一個事務中可以有多個SAVEPOINT;
-
RELEASE SAVEPOINT identifier;刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;
-
ROLLBACK TO identifier;把事務回滾到標記點;
-
SET TRANSACTION;用來設置事務的隔離級別。InnoDB存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
MYSQL 事務處理主要有兩種方法
-
用 BEGIN, ROLLBACK, COMMIT來實現
1-1. BEGIN 開始一個事務
1-2. ROLLBACK 事務回滾
1-3. COMMIT 事務確認 -
直接用 SET 來改變 MySQL 的自動提交模式:
2-1. SET AUTOCOMMIT=0 禁止自動提交
2-2. SET AUTOCOMMIT=1 開啓自動提交
多事務的併發處理機制
原因:多個事務同時操作一個表中的同一行數據,如果這些操作是.修改操作的話,就會產生併發問題,如果不處理,則會造成數據不一致的情況.
數據庫可能產生的併發問題包括:
髒讀
是指一個事務正在訪問數據,並且對這個數據進行修改,而這種修改
還沒有提交到數據庫中,而另一個事務也訪問了這個數據,並且使用了這個數據.
解決方法:一個事務在修改數據時,該數據不能被其他事務訪問
不可重複讀
是指一個事務多次讀取同一條記錄,如果此時另一個事務也訪問並且
修改了該數據,則就會出現多次讀取出現數據不一致的情況,原來的
數據變成了不可重複讀取的數據
解決方法:只有在修改事務完全提交過後纔可以讀取到數據
幻讀
是指一個事務修改表中的多行記錄,但是此時另一個事務對該表格進行
了插入數據的操作,則第一個事務會發現表格中會出現沒有被修改的行,
就像發生了幻覺一樣.
解決方法:在一個事務提交數據之前,其他事務不能添加數據
不可重複讀的重點是修改,同樣的條件,你讀取過的數據,再次讀取出來發現值不一樣了幻讀的重點在於新增或者刪除
事務隔離級別
- READ_UNCOMMITTED
這是事務最低的隔離級別,它充許另外一個事務可以看到這個事務未提交的數據。
解決第一類丟失更新的問題,但是會出現髒讀、不可重複讀.
- READ_COMMITTED
保證一個事務修改的數據提交後才能被另外一個事務讀取,即另外一個事務不能讀取該事務未提交的數據。
解決第一類丟失更新和髒讀的問題,但會出現不可重複讀.
- REPEATABLE_READ
保證一個事務相同條件下前後兩次獲取的數據是一致的
解決第一類丟失更新,髒讀、不可重複讀.
- SERIALIZABLE
事務被處理爲順序執行。解決所有問題 - 有點類似於鎖表.
性能及其低下.
提醒:
Mysql默認的事務隔離級別爲repeatable_read