MySQL事務

在MySQL中,所有的DML操作在執行之後都會有一個commit操作[隱式的]

commit的意思就是用來提交事務.

DTL,數據事務語言

事務的定義:

就是指一組相關的SQL操作,我們所有的操作都是處在事務中的

注意:

  1. 在數據庫中**,執行業務的基本單位是事務,不是以某一條SQL**

  2. 數據庫在默認情況下,事務都是打開的,也就是說它是一直

  3. 處在事務中的,一個事務的結束,代表着下一個事務的開啓

  4. 執行commit或者rollback指令時,會結束當前事務

    [已經提交的事務將不能夠被回滾]

作用:用來保證數據的平穩性和可預測性.

事務的四大特性(ACID):

  1. atomic,原子性,事務是不可再分割的,要麼同時成功,要麼同時失敗

  2. consistency,一致性,事務一旦結束,內存中的數據和數據庫中的數據是保持一致的.

  3. isolation,隔離性,事務之間互不干擾,一個事務的結束意味着下一個事務的開啓

  4. duration,持久性,事務一旦提交,則數據持久化到數據庫中,永久保存

    [涉及到數據庫的備份和恢復的一些技術,冷備份,熱備份…]

事務控制語句

  1. BEGIN或START TRANSACTION;顯式地開啓一個事務;

  2. **COMMIT;**也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,並使已對數據庫進行的所有修改成爲永久性的;

  3. **ROLLBACK;**有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束用戶的事務,並撤銷正在進行的所有未提交的修改;

  4. SAVEPOINT identifier;SAVEPOINT允許在事務中創建一個保存點,一個事務中可以有多個SAVEPOINT;

  5. RELEASE SAVEPOINT identifier;刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;

  6. ROLLBACK TO identifier;把事務回滾到標記點;

  7. SET TRANSACTION;用來設置事務的隔離級別。InnoDB存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

MYSQL 事務處理主要有兩種方法

  1. 用 BEGIN, ROLLBACK, COMMIT來實現

    1-1. BEGIN 開始一個事務

    1-2. ROLLBACK 事務回滾

    1-3. COMMIT 事務確認

  2. 直接用 SET 來改變 MySQL 的自動提交模式:

    2-1. SET AUTOCOMMIT=0 禁止自動提交

    2-2. SET AUTOCOMMIT=1 開啓自動提交

多事務的併發處理機制

原因:多個事務同時操作一個表中的同一行數據,如果這些操作是.修改操作的話,就會產生併發問題,如果不處理,則會造成數據不一致的情況.

數據庫可能產生的併發問題包括:

  1. 髒讀

是指一個事務正在訪問數據,並且對這個數據進行修改,而這種修改

還沒有提交到數據庫中,而另一個事務也訪問了這個數據,並且使用了這個數據.

解決方法:一個事務在修改數據時,該數據不能被其他事務訪問

  1. 不可重複讀

是指一個事務多次讀取同一條記錄,如果此時另一個事務也訪問並且

修改了該數據,則就會出現多次讀取出現數據不一致的情況,原來的

數據變成了不可重複讀取的數據

解決方法:只有在修改事務完全提交過後纔可以讀取到數據

  1. 幻讀

是指一個事務修改表中的多行記錄,但是此時另一個事務對該表格進行

了插入數據的操作,則第一個事務會發現表格中會出現沒有被修改的行,

就像發生了幻覺一樣.

解決方法:在一個事務提交數據之前,其他事務不能添加數據

不可重複讀的重點是修改,同樣的條件,你讀取過的數據,再次讀取出來發現值不一樣了幻讀的重點在於新增或者刪除

事務隔離級別

  1. READ_UNCOMMITTED

這是事務最低的隔離級別,它充許另外一個事務可以看到這個事務未提交的數據。
解決第一類丟失更新的問題,但是會出現髒讀、不可重複讀.

  1. READ_COMMITTED

保證一個事務修改的數據提交後才能被另外一個事務讀取,即另外一個事務不能讀取該事務未提交的數據。
解決第一類丟失更新和髒讀的問題,但會出現不可重複讀.

  1. REPEATABLE_READ

保證一個事務相同條件下前後兩次獲取的數據是一致的
解決第一類丟失更新,髒讀、不可重複讀.

  1. SERIALIZABLE

事務被處理爲順序執行。解決所有問題 - 有點類似於鎖表.

性能及其低下.

提醒:
Mysql默認的事務隔離級別爲repeatable_read

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章