一、事務(wù)的基本介紹
如果一個(gè)包含多個(gè)步驟的業(yè)務(wù)操作,被事務(wù)管理,那么這些操作要么同時(shí)成功,要么同時(shí)失敗。
二、事務(wù)的基本語(yǔ)法
-- 1.開啟事務(wù)
start transaction;
-- 2.回滾
rollback;
-- 3.提交
commit;
三、事務(wù)的舉例
-- 創(chuàng)建account表
Create TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE

);
-- 添加數(shù)據(jù)
INSERT INTO account(NAME,balance) VALUES('ZHANGSAN'1000),('lisi',1000)
模擬一個(gè)轉(zhuǎn)賬操作張三給李四轉(zhuǎn)賬500元
-- 0.開啟事務(wù)
START TRANSACTION;
-- 1.張三賬號(hào)減500元
UPDATE account SET balance = balance - 500
WHERE NAME = 'zhangsan';
-- 2.李四賬號(hào)加500元
--- 出錯(cuò)了 ---
UPDATE account SET balance = balance + 500
WHERE NAME = 'lisi';
--發(fā)現(xiàn)執(zhí)行沒有問題,提交事務(wù)

COMMIT;
-- 發(fā)現(xiàn)出問題了,回滾事務(wù)
ROLLBACK;
四、事務(wù)的提交
MySQL數(shù)據(jù)庫(kù)中事務(wù)默認(rèn)自動(dòng)提交。
1.事務(wù)提交的方式
(1)自動(dòng)提交
1.MySQL就是自動(dòng)提交的
2.一條DML(增刪改)語(yǔ)句會(huì)自動(dòng)提交一次事務(wù)
(2)手動(dòng)提交
1.數(shù)據(jù)庫(kù)默認(rèn)是手動(dòng)提交事務(wù)
2.需要先開啟事務(wù),再提交
2.修改事務(wù)的提交方式
-- 查看事務(wù)的提交方式

SELECT @@autocommit; //1代表自動(dòng)提交,0代表手動(dòng)提交
-- 修改默認(rèn)的提交方式
set @@autocommit = 0;
五、事務(wù)的四大特性
1.原子性:是不可分割的最小操作單位,要么同時(shí)成功數(shù)據(jù)庫(kù)中的事務(wù)是什么,要么同時(shí)失敗。
2.持久性:當(dāng)事務(wù)提交或回滾后,數(shù)據(jù)庫(kù)會(huì)持久化的保存數(shù)據(jù)
3.隔離性:多個(gè)事務(wù)之間。相互獨(dú)立
4.一致性:事務(wù)操作前后數(shù)據(jù)總量不變。
六、事務(wù)的隔離級(jí)別(了解)
概念:多個(gè)事務(wù)之間是相互隔離、相互獨(dú)立的。但是如果多個(gè)事務(wù)操作同一批語(yǔ)句,則會(huì)引發(fā)一些問題,設(shè)置不同的隔離級(jí)別就可以解決這些問題。
1.存在的問題
1.臟讀:一個(gè)事務(wù),讀取到另一個(gè)事務(wù)中沒有提交的數(shù)據(jù)
2.不可重復(fù)讀(虛讀):在同一個(gè)事務(wù)中,兩次讀取到的數(shù)據(jù)不一樣
3.幻讀:一個(gè)事務(wù)操作(DML)數(shù)據(jù)庫(kù)中所有的記錄,另一個(gè)事務(wù)添加了一條數(shù)據(jù)數(shù)據(jù)庫(kù)中的事務(wù)是什么,則第一個(gè)事務(wù)查詢不到自己的修改數(shù)據(jù)。
2.隔離級(jí)別
1.read uncommitted: //讀未提交
-- 產(chǎn)生的問題:臟讀,不可重復(fù)讀,幻讀
2.read committed: //讀已提交(Oracle默認(rèn))
--產(chǎn)生的問題:不可重復(fù)讀,幻讀
3.repeatable read: //可重復(fù)讀(mysql默認(rèn))
-- 產(chǎn)生的問題:幻讀
4.serializable: //串行化(一個(gè)事務(wù)在操作表的時(shí)候,另一個(gè)事務(wù)無(wú)法操作表,表會(huì)被鎖住,只有前一個(gè)事務(wù)回滾或者提交事務(wù)之后,后一個(gè)事務(wù)才能對(duì)表進(jìn)行操作,效率很低)

-- 可以解決任何問題
3.注意事項(xiàng)
-- 注意:隔離級(jí)別從小到大安全性越來(lái)越高,效率越來(lái)越低。
-- 數(shù)據(jù)庫(kù)查詢隔離級(jí)別
SELECT @@tx_isolation;
-- 數(shù)據(jù)庫(kù)設(shè)置隔離級(jí)別:
SET global transaction isolation level '級(jí)別字符串';
4.具體演示
set global transaction isolation level read uncommitted;
start transaction;
-- 轉(zhuǎn)賬操作
update account set balance = balance - 500 where id=1;
update account set balance = balance + 500 where id=2;