事務(wù)
一個或一組sql語句組成的執(zhí)行單元,要么全部執(zhí)行,要么全部不執(zhí)行,若某一條失敗,則會回滾(如:轉(zhuǎn)賬)
存儲引擎(表類型):在mysql中的數(shù)據(jù)用不同的技術(shù)存儲在文件(或內(nèi)存)中。可以使用SHOW ENGINES,來查看mysql支持的存儲引擎。
INNODB支持事務(wù),MYISAM、MEMORY不支持事務(wù)
事務(wù)的ACID屬性
①原子性(Atomicity):事務(wù)是一個不可分割的工作單位
②一致性(Consistency):事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)
③隔離性(Isolation):一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)時隔離的,不能互相干擾(受隔離級別影響)
④持久性(Durability):一個事務(wù)一旦被提交,對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的
事務(wù)的創(chuàng)建
隱式事務(wù):事務(wù)沒有明顯的開啟和結(jié)束的標(biāo)記,如一個簡單的sql語句
ps:可通過 SHOW VARIABLES LIKE ‘a(chǎn)utocommit’ 可以發(fā)現(xiàn)事務(wù)是默認(rèn)提交的
顯式事務(wù):事務(wù)具有明顯的開啟和結(jié)束的標(biāo)記,必須先設(shè)置自動提交功能為禁用
①開啟事務(wù):set autocommit = 0; start transaction;(可選)
②編寫事務(wù)中的sql語句
③結(jié)束事務(wù):commit;進行提交 rollback;出錯回滾
數(shù)據(jù)庫的隔離級別(同時開啟兩個事務(wù)T1、T2)
①臟讀:T1讀取了已經(jīng)被T2更新但還沒提交的字段,若T2回滾,則T1讀取的內(nèi)容就是臨時且無效的
②不可重復(fù)讀:T1讀取一個字段后,T2更新該字段,T1再次讀取同一個字段時,值就不同了
Ps:可將第一次查詢的數(shù)據(jù)進行上鎖來避免
③幻讀:T1從一個表中讀取一個字段后,T2在該表中插入/刪除了一些新的行,若T1再次讀取同一個表,就會多出幾行
Ps:由于查詢涉及的數(shù)據(jù)較多(需將整個表上鎖),所以不好解決
數(shù)據(jù)庫事務(wù)的隔離性:數(shù)據(jù)庫系統(tǒng)必須具有隔離并發(fā)運行各個事務(wù)的能力,使他們不會互相影響,避免并發(fā)
四種隔離級別:
READ UNCOMMITTED(讀未提交:①②③)
READ COMMITTED(讀已提交:②③)
REPEATABLE READ (可重復(fù)讀:③)
SERIALIZABLE (串行化:全可避免,相當(dāng)于加鎖)
ORACEL:支持兩種事務(wù)隔離級別:READ COMMITED、SERIALIZABLE,默認(rèn)為READ COMMITED
MYSQL:支持四種事務(wù)隔離級別:默認(rèn)為:REPEATABLE READ
PS:SELECT @@transaction_isolation (8.0+新變量名) #查看數(shù)據(jù)庫當(dāng)前的隔離級別
SET SESSION(只針對當(dāng)前連接,GLOBAl關(guān)鍵字針對所有連接) TRANSACTION ISOLATION LEVEL 隔離級別 #更改隔離級別
Tips:事務(wù)回滾只對CRUD有效,對DDL語句無效
節(jié)點
SAVEPOINT 節(jié)點名; #設(shè)置保存點
ROLLBACK TO 節(jié)點名; #回滾到保存點
RELEASE SAVEPOINT 節(jié)點名; #刪除保存點
DELETE 和 TRUNCATE 在使用事務(wù)時的區(qū)別
①DELETE語句是數(shù)據(jù)庫操作語言(DML),這個操作會放到rollback segment 中,事務(wù)提交之后才生效,可以進行回滾,如果有相應(yīng)的 trigger,執(zhí)行的時候?qū)⒈挥|發(fā)。
②TRUNCATE是數(shù)據(jù)庫定義語言(DDL),操作立即生效,原數(shù)據(jù)不放到 rollback segment 中,不能回滾,操作不觸發(fā) trigger
轉(zhuǎn)載自:https://blog.csdn.net/qq_41891805/article/details/104130712