事務(wù)由一組sql語(yǔ)句組成
事務(wù)的sql語(yǔ)句整體成功,整體失敗
A:100 B:0-> A:0 B:100
-- A轉(zhuǎn)賬B
update 賬戶(hù) set money=money-100
where id='A';
update 賬戶(hù) set money=money+100
where id='B';
-- 轉(zhuǎn)賬要么同時(shí)成功,要么同時(shí)失敗(只要有一個(gè)失敗就)回到轉(zhuǎn)賬執(zhí)行之前的狀態(tài)
數(shù)據(jù)操作的最小單元是事務(wù),而不是sql語(yǔ)句
事務(wù)的操作
不啟動(dòng)事務(wù)是單條的sql語(yǔ)句的成功與失敗(某條sql語(yǔ)句失敗,前面的操作不恢復(fù))
啟動(dòng)事務(wù)后,執(zhí)行sql語(yǔ)句,中間某條sql語(yǔ)句失敗,它前面的操作還可恢復(fù),這種恢復(fù)以前的狀態(tài)叫回滾,回滾到事務(wù)之前。
啟動(dòng)事務(wù)
begin
或
start transaction
事務(wù)啟動(dòng)后,執(zhí)行的增刪改操作,會(huì)暫時(shí)記錄在一個(gè)日志文件中(臨時(shí)記錄)。
提交事務(wù)
commit
提交事務(wù)后,事務(wù)日志中的記錄數(shù)據(jù)操作在數(shù)據(jù)表中生效,并清空日志文件。
回滾事務(wù)
rollback
直接清空日志


事務(wù)的特性
A——原子性Atomic
數(shù)據(jù)操作的最小單元是事務(wù),而不是sql語(yǔ)句
C——致性Consistency
一致性,事務(wù)完成前后,數(shù)據(jù)要保持邏輯的一致性
A+B=100轉(zhuǎn)賬前
A+B=100轉(zhuǎn)賬后
I——隔離性Isolation
一個(gè)事務(wù)操作時(shí),其他事務(wù)要等待。
一個(gè)事務(wù)修改數(shù)據(jù),另一個(gè)事務(wù)不能修改,這兩個(gè)事務(wù)要進(jìn)行隔離。
事務(wù)并不是完全隔離的(效率低),數(shù)據(jù)庫(kù)為了兼顧并發(fā)性和數(shù)據(jù)安全,一定程度上允許事務(wù)并發(fā)執(zhí)行,并設(shè)置了隔離的級(jí)別。
D——Durancy
持久性,事務(wù)成功,數(shù)據(jù)被永久的保存
數(shù)據(jù)訪問(wèn)沖突的問(wèn)題
多個(gè)事務(wù)同時(shí)執(zhí)行,可能引發(fā)三種數(shù)據(jù)訪問(wèn)沖突問(wèn)題:
1.臟數(shù)據(jù)
2.不可重復(fù)讀
3.幻覺(jué)讀
1.臟數(shù)據(jù)
一個(gè)事務(wù)未提交的數(shù)據(jù)(臨時(shí)保存在內(nèi)存文件中,表里還沒(méi)保存,有可能在未來(lái)失效)(或者修改數(shù)據(jù),沒(méi)修改完),被另一個(gè)事務(wù)查詢(xún)到
2.不可重復(fù)讀
數(shù)據(jù)每次讀取的結(jié)果一致叫可重復(fù)讀。
針對(duì)數(shù)據(jù)修改的update操作
查詢(xún)過(guò)的數(shù)據(jù)(數(shù)據(jù)被別的事務(wù)修改并提交了)再次查詢(xún)時(shí),與之前的查詢(xún)結(jié)果不一致
3.幻覺(jué)讀
針對(duì)數(shù)據(jù)的插入和刪除操作:
新插入的數(shù)據(jù),查詢(xún)不到
刪除的數(shù)據(jù),能查詢(xún)到(看到不該看的東西)
隔離級(jí)別
為了避免數(shù)據(jù)訪問(wèn)沖突問(wèn)題,避免數(shù)據(jù)的混亂,數(shù)據(jù)庫(kù)會(huì)讓事務(wù)進(jìn)行隔離(別讓事務(wù)同時(shí)執(zhí)行,保證數(shù)據(jù)安全)
為了兼顧數(shù)據(jù)安全和性能數(shù)據(jù)庫(kù)提供了四種隔離級(jí)別
級(jí)別越高越安全,性能越差
級(jí)別越低越不安全,性能越高
mysql設(shè)置隔離級(jí)別
set tx_isolation='read-uncommitted';
1.未提交可讀-臟讀,不可重復(fù)讀,幻覺(jué)讀
set tx_isolation='read-committed';
2.提交可讀-不可重復(fù)讀,幻覺(jué)讀
set tx_isolation='repeatable-read'; --默認(rèn)級(jí)別
3.可重復(fù)讀-幻覺(jué)讀(默認(rèn)級(jí)別,最佳選擇)
set tx_isolation='serialiable';
4.串行化-排列執(zhí)行(級(jí)別最高)

這樣導(dǎo)致了臟讀

這樣導(dǎo)致了不可重復(fù)讀

這樣導(dǎo)致了幻覺(jué)讀,新插入的數(shù)據(jù)看不到

這樣導(dǎo)致了幻覺(jué)讀,假更新了刪除的數(shù)據(jù),commit后才發(fā)現(xiàn)數(shù)據(jù)早就被刪除了