1. 什么是事務(wù):
一個(gè)或一組sql語句組成一個(gè)執(zhí)行單元,這個(gè)執(zhí)行單元要么全部執(zhí)行,要么全部不執(zhí)行
2. 事務(wù)的ACID屬性:
- 原子性:事務(wù)是一個(gè)不可分割的工作單位歌溉,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生
- 一致性:事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另外一個(gè)一致性狀態(tài)
- 隔離性:一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾骑晶,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)的其他事務(wù)是隔離的痛垛,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾
- 持久性:一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的透罢,接下來的其他操作和數(shù)據(jù)庫故障不應(yīng)該對(duì)其有任何影響
3. 分類:
- 隱式事務(wù):事務(wù)沒有明顯的開啟和結(jié)束的標(biāo)記(比如insert榜晦,update,delete語句)
- 顯式事務(wù):事務(wù)具有明顯的開啟和結(jié)束的標(biāo)記(autocommit變量設(shè)置為0)
SHOW VARIABLES LIKE 'autocommit' ;
SET autocommit = 0 ;
4. 事務(wù)的使用步驟
- 開啟事務(wù)
-- 默認(rèn)開啟事務(wù)
SET autocommit = 0 ;
-- 可以不寫
START TRANSACTION ;
- 編寫SQL語句(增刪改查)
- 結(jié)束事務(wù)
-- 提交事務(wù)
COMMIT ;
-- 回滾事務(wù)
ROLLBACK ;
5. 事務(wù)的使用演示
SET autocommit = 0 ;
UPDATE
`account`
SET
`balance` = `balance` - 9900
WHERE `username` = '費(fèi)渡' ;
UPDATE
`account`
SET
`balance` = `balance` + 9900
WHERE `username` = '駱聞舟' ;
COMMIT ;
delete支持回滾羽圃,但truncate不支持
6. 事務(wù)的隔離級(jí)別
同時(shí)運(yùn)行多個(gè)事務(wù)可能會(huì)產(chǎn)生的并發(fā)問題
- 臟讀:T2修改了數(shù)據(jù)但是還沒有提交乾胶,此時(shí)T1讀取到的數(shù)據(jù)是T2操作后的臨時(shí)數(shù)據(jù),如果此時(shí)T2回滾朽寞,那么T1讀取到的數(shù)據(jù)就是錯(cuò)誤的
- 不可重復(fù)讀:T1讀取了一個(gè)數(shù)據(jù)识窿,之后T2對(duì)該數(shù)據(jù)做了修改,此時(shí)如果T1再進(jìn)行讀取脑融,讀取到的數(shù)據(jù)就和之前不同
- 幻讀:T1從表中讀取了部分字段喻频,然后T2在表中插入了一些行,此時(shí)如果T1再進(jìn)行讀取肘迎,讀取到的數(shù)據(jù)就會(huì)比原來多出幾行
四種隔離級(jí)別
- READ UNCOMMITED:允許事務(wù)讀取未被其他事務(wù)提交的變更(三種問題都無法避免)
- READ COMMITED:只允許事務(wù)讀取已經(jīng)被其他事務(wù)提交的變更(只能避免臟讀)
- REPEATABLE READ:確保事務(wù)可以多次從一個(gè)字段中讀取相同的值甥温,在這個(gè)事務(wù)持續(xù)期間锻煌,禁止其他事務(wù)對(duì)這個(gè)字段進(jìn)行更新(幻讀依然存在)
- SERIALIZABLE:確保事務(wù)可以從一個(gè)表中讀取相同的行,在這個(gè)事務(wù)持續(xù)期間姻蚓,禁止其他事務(wù)對(duì)該表執(zhí)行增刪改操作(可以解決所有問題宋梧,但是效率較低)
隔離級(jí)別演示
-- 查看當(dāng)前的事務(wù)隔離級(jí)別
select @@tx_isolation;
-- 設(shè)置當(dāng)前連接事務(wù)的隔離級(jí)別
set session transaction isolation level read uncommitted;
-- 設(shè)置數(shù)據(jù)庫系統(tǒng)的全局的隔離級(jí)別
set global transaction isolation level read committed ;
7. savepoint的使用
SET autocommit = 0 ;
START TRANSACTION ;
DELETE
FROM
`account`
WHERE id = 1 ;
SAVEPOINT a ;
DELETE
FROM
`account`
WHERE id = 2 ;
ROLLBACK TO a ;