尚硅谷mysql | TCL語言(事務(wù))

TCL:TRANSACTION Control LANGUAGE 事務(wù)控制語言
事務(wù):一條或一組SQL語言組成一個(gè)執(zhí)行單元,這個(gè)執(zhí)行單元要么全部執(zhí)行,要么全部不執(zhí)行

入門案例:轉(zhuǎn)賬
張三豐 1000
郭襄 1000
UPDATE 表 SET 張三豐的余額=500 WHERE NAME = '張三豐'
出現(xiàn)意外
UPDATE 表 SET 郭襄的余額=1500 WHERE NAME = '郭襄'

#顯示存儲引擎
SHOW ENGINES;

INNODB 支持事務(wù)
事務(wù)的特點(diǎn):ACID屬性
原子性(A):事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生
一致性(C):事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)切換到另一個(gè)一致性狀態(tài)(數(shù)據(jù)庫是完整的,準(zhǔn)確的)
隔離性(I):一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾,對其他并發(fā)事務(wù)是隔離的,不能互相干擾
持久性(D):一個(gè)事務(wù)一旦被提交,對數(shù)據(jù)的改變就是永久的,接下來的其他操作和數(shù)據(jù)庫故障不應(yīng)該對其有任何影響
事務(wù)的創(chuàng)建
隱式事務(wù):事務(wù)沒有明顯的開啟和結(jié)束的標(biāo)記,會自動開啟
比如INSERT、UPDATE、DELETE語句
查看自動提交功能的情況

SHOW VARIABLES LIKE 'autocommit';

顯示事務(wù):事務(wù)有明顯的開啟和結(jié)束的標(biāo)記
前提:必須先設(shè)置自動提交功能為禁用:SET autocommit = 0;
開啟事務(wù)的語句;
UPDATE 表 SET 張三豐的余額=500 WHERE NAME = '張三豐'
UPDATE 表 SET 郭襄的余額=1500 WHERE NAME = '郭襄'
結(jié)束事務(wù)的語句;

步驟1:開啟事務(wù)

SET autocommit = 0
START transacion;可選的

步驟2:編寫事務(wù)中的SQL語句(SELECT INSERT UPDATE DELETE)

語句1;
語句2;
···

步驟3:結(jié)束事務(wù)

COMMIT;提交事務(wù)
ROLLBACK;回滾事務(wù)

SAVEPOINT 節(jié)點(diǎn)名; 設(shè)置保存點(diǎn)

演示事務(wù)的使用步驟

DROP TABLE IS EXISTS account;
CREATE TABLE account(
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20),
    balance DOUBLE
    );
INSERT INTO account(username,balance)
VALUES('張無忌',100),('趙敏',1000);

案例1:正常提交事務(wù)

#開啟事務(wù)
SET autocommit = 0;
START TRANSACTION;
#編寫一組事務(wù)的語句
UPDATE account SET balance = 500 WHERE username = '張無忌';
UPDATE account SET balance = 1500 WHERE username = '趙敏';
#結(jié)束事務(wù)
COMMIT;

案例2:回滾事務(wù)

#開啟事務(wù)
SET autocommit = 0;
START TRANSACTION;
#編寫一組事務(wù)的語句
UPDATE account SET balance = 1000 WHERE username = '張無忌';
UPDATE account SET balance = 1000 WHERE username = '趙敏';
#結(jié)束事務(wù)
ROLLBACK;
#commit;
在結(jié)束之前,都是在內(nèi)存操作的,沒有提交

2.delete和truncate在事務(wù)使用時(shí)的區(qū)別

演示DELETE,支持回滾

SET autocommit = 0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;
SELECT * FROM account;

演示TRUNCATE,不支持回滾

SET autocommit = 0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;
SELECT * FROM account;

并發(fā)事務(wù)

  1. 何時(shí)發(fā)生:多個(gè)事務(wù)同時(shí)操作同一個(gè)數(shù)據(jù)庫的相同數(shù)據(jù)時(shí)
  2. 并發(fā)問題都有哪些:
  • 臟讀:t1讀取了t2還沒有提交的數(shù)據(jù),然后t2回滾了,則t1讀取的內(nèi)容就是臨時(shí)且無效的
  • 不可重復(fù)讀:t1讀取了一個(gè)字段,然后t2更新了,之后t1再讀取,值有所不同
  • 幻讀:t1讀取了一個(gè)字段之后,t2插入(刪除)了幾行數(shù),t1再讀取之后表變了

通過設(shè)置隔離級別解決并發(fā)事務(wù)
mysql一共4種隔離級別,默認(rèn)的隔離級別是 REPEATABLE READ
事務(wù)的隔離級別:

-- 臟讀 幻讀 不可重復(fù)讀
READ UNCOMMITTED
READ COMMITTED ×
REPEATABLE READ × ×
SERIALIZABLE × × ×

mysql 中默認(rèn)第三個(gè)隔離級別 REPEATABLE READ
oracle 中默認(rèn)第二個(gè)隔離級別 READ COMMITTED
查看隔離級別:

mysql8.0:SELECT @@transcation_isolation;
mysql5.0:SELECT @@tx_isolation;

設(shè)置隔離級別

SET SESSION | GLOBAL TRANSACTION ISOLATION LEVEL 隔離級別;
  1. 演示SAVEPOINT的使用,只能搭配ROLLBACK TO
SET autocommit = 0;
START TRANSACTION ;
DELETE FROM account WHERE id = 1;
SAVEPOINT a;#設(shè)置保存點(diǎn)
DELETE FROM account WHERE id = 2;
ROLLBACK TO a;#回滾到保存點(diǎn)
SELECT * FROM account;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容