MySQL_基礎_TCL事務控制語言

事務(ACID)的特性

原子性(Atomicity)    一個事務不可再分割,要麼都執行要麼都不執行
一致性(Consistency)  一個事務執行會使數據從一個一致狀態切換到另一個一致狀態
隔離性(Isolation)    一個事務的執行不受其餘事務的干擾
持久性(Durability)   一個事務一旦提交,則會永久的改變數據庫的數據

 

事務的併發問題

髒讀:讀到未提交更新數據,就是讀到另外一個事務未提交數據,就是髒數據
不可重複讀:對同一記錄兩次讀取不一致,由於另外一事務對該記錄作了修改
幻讀:對同一張表的兩次查詢不一致,由於另外一事務插入了一條數據

 

事務的隔離級別

隔離級別                    髒讀       不可重複讀        幻讀
未提交讀(READ-UNCOMMITTED)   √            √            √
已提交讀(READ-COMMITTED)     ×            √            √
可重複讀(REPEATABLE-READ)    ×            ×            √
可串行化(SERIALIZABLE)       ×            ×            ×

Oracle 支持的 2 種事務隔離級別: READ-COMMITTED, SERIALIZABLE。 Oracle 默認的事務隔離級別爲: READ-COMMITTED
Mysql 支持 4 種事務隔離級別. Mysql 默認的事務隔離級別爲: REPEATABLE-READ

查看隔離級別
SELECT @@[session.]tx_isolation;                        # 查看會話隔離級別
SELECT @@global.tx_isolation;                           # 查看全局隔離級別

設置隔離級別
SET [SESSION] TRANSACTION ISOLATION LEVEL 隔離級別;     # 設置會話隔離級別
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔離級別;        # 設置全局隔離級別

 

事務的使用

事務提交
    SET autocommit = 0;                                           # 關閉自動提交
    START TRANSACTION;                                            # 開啓事務
    INSERT INTO user(username, password) VALUES ('張三', '123');    # 執行SQL1
    INSERT INTO user(username, password) VALUES ('李四', '456');    # 執行SQL2
    COMMIT;                                                       # 提交全部
    SET autocommit = 1;                                           # 開啓自動提交

事務回滾
    1、回滾全部
    SET autocommit = 0;                                           # 關閉自動提交
    START TRANSACTION;                                            # 開啓事務
    INSERT INTO user(username, password) VALUES ('張三', '123');    # 執行SQL1
    INSERT INTO user(username, password) VALUES ('李四', '456');    # 執行SQL2
    ROLLBACK;                                                     # 回滾全部
    SET autocommit = 1;                                           # 開啓自動提交 2、回滾至保存點
    SET autocommit = 0;                                           # 關閉自動提交
    START TRANSACTION;                                            # 開啓事務
    INSERT INTO user(username, password) VALUES ('張三', '123');    # 執行SQL1
    SAVEPOINT a;                                                  # 設置保存點
    INSERT INTO user(username, password) VALUES ('李四', '456');    # 執行SQL2
    ROLLBACK TO a;                                                # 回滾至保存點
    SET autocommit = 1;                                           # 開啓自動提交
相關文章
相關標籤/搜索