事務(wù)是一組操作的集合费彼,事務(wù)會(huì)把所有操作作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請(qǐng)求削咆,即這些操作要么同時(shí)成功,要么同時(shí)失敗杖剪。
注意:默認(rèn)MySQL的事務(wù)是自動(dòng)提交的冻押,也就是說(shuō),當(dāng)執(zhí)行完一條DML語(yǔ)句時(shí)盛嘿,MySQL會(huì)立即隱式的提交事務(wù)洛巢。
控制事務(wù)
查看事務(wù)提交方式
SELECT @@AUTOCOMMIT;
SET @@AUTOCOMMIT = 0;
設(shè)置事務(wù)提交方式,1為自動(dòng)提交次兆,0為手動(dòng)提交稿茉,該設(shè)置只對(duì)當(dāng)前會(huì)話有效
開啟事務(wù):
START TRANSACTION 或 BEGIN TRANSACTION;
提交事務(wù):
COMMIT;
回滾事務(wù):
ROLLBACK;
操作實(shí)例:
--開啟事務(wù)
start transaction;
--查詢張三余額
select * from account where name = '張三';
--張三余額減少1000
update account set money = money - 1000 where name = '張三';
--李四余額增加1000
update account set money = money + 1000 where name = '李四';
--如果正常執(zhí)行完畢,則提交事務(wù)
commit;
--如果執(zhí)行過(guò)程中報(bào)錯(cuò),則回滾事務(wù)
rollback;
原子性(Atomicity):事務(wù)是不可分割的最小操作但愿,要么全部成功芥炭,要么全部失敗
一致性(Consistency):事務(wù)完成時(shí)漓库,必須使所有數(shù)據(jù)都保持一致狀態(tài)
隔離性(Isolation):數(shù)據(jù)庫(kù)系統(tǒng)提供的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的獨(dú)立環(huán)境下運(yùn)行
持久性(Durability):事務(wù)一旦提交或回滾园蝠,它對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久的
問(wèn)題描述
臟讀一個(gè)事務(wù)讀到另一個(gè)事務(wù)還沒提交的數(shù)據(jù)
不可重復(fù)讀一個(gè)事務(wù)先后讀取同一條記錄渺蒿,但兩次讀取的數(shù)據(jù)不同
幻讀一個(gè)事務(wù)按照條件查詢數(shù)據(jù)時(shí),沒有對(duì)應(yīng)的數(shù)據(jù)行彪薛,但是再插入數(shù)據(jù)時(shí)茂装,又發(fā)現(xiàn)這行數(shù)據(jù)已經(jīng)存在
這三個(gè)問(wèn)題的詳細(xì)演示:詳細(xì)演示
并發(fā)事務(wù)隔離級(jí)別:
隔離級(jí)別臟讀不可重復(fù)讀幻讀
Read uncommitted√√√
Read committed×√√
Repeatable Read(默認(rèn))××√
Serializable×××
√表示在當(dāng)前隔離級(jí)別下該問(wèn)題會(huì)出現(xiàn)
Serializable 性能最低怠蹂;Read uncommitted 性能最高,數(shù)據(jù)安全性最差
查看事務(wù)隔離級(jí)別:
SELECT @@TRANSACTION_ISOLATION;
設(shè)置事務(wù)隔離級(jí)別:
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE };
SESSION 是會(huì)話級(jí)別少态,表示只針對(duì)當(dāng)前會(huì)話有效褥蚯,GLOBAL 表示對(duì)所有會(huì)話有效