開啟事物:當(dāng)開啟事物之后,數(shù)據(jù)只會在臨時表修改,如果不提交,那么關(guān)閉窗口之后,事物就會自動回滾
START TRANSACTION;
如果發(fā)現(xiàn)錯誤,執(zhí)行回滾,就不會講數(shù)據(jù)提交給正式表
ROLLBACK;
如果沒有錯誤,那么就提交數(shù)據(jù)
COMMIT;
---------------------------
在mysql中一條語句會自動提交
為1代表自動提交

image.png
---將參數(shù)改為0,就是一條語句不默認(rèn)提交,除非commit
set @@autocommit=0;
ps:mysql是自動提交一條語句,而Oracle是手動提交一條語句
事物的四大特征
1.原子性:是不可分割的最小操作單位,要么同時成功,要么同時失敗
2.持久性:如果事物一旦提價或者回滾,數(shù)據(jù)庫會持久化的保存數(shù)據(jù)
3.隔離性:多個事物之間相互獨立
4.一致性:事物操作前后,數(shù)據(jù)總量不變
事物的隔離級別
//多個事物操作同一批數(shù)據(jù)可能引發(fā)的問題
1.臟讀:一個事物讀取到另一個事物中沒有提交的事物
2.不可重復(fù)讀(虛讀):在同一個事物中,兩次讀取到的數(shù)據(jù)不一樣
3.幻讀:一個事物操作(DML)數(shù)據(jù)表中所有記錄,另一個事物添加了一條數(shù)據(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)生的問題:幻讀
為什么會產(chǎn)生不可重復(fù)讀問題?
當(dāng)兩個窗口設(shè)置為read committed的時候,第一個窗口開啟了事
務(wù),然后修改數(shù)據(jù)但是未提交,
這個時候,第二個窗口查詢的是原來的數(shù)據(jù),然后第一個窗口提交數(shù)據(jù),第
二個窗口再次查詢數(shù)據(jù),查詢到的是修改后的數(shù)據(jù),
這樣兩次查詢出來的數(shù)據(jù)就不一樣,所以就叫不可重復(fù)讀!
當(dāng)設(shè)置為可重復(fù)讀之后,兩個窗口都開啟事物,第一個窗口修改數(shù)據(jù)
但是未提交,第二個窗口查詢數(shù)據(jù)也未提交,這個時候查詢的是未修改的數(shù)
據(jù),然后第一個窗口提交數(shù)據(jù),但是第二個窗口再次查詢數(shù)據(jù),仍然未提交
事務(wù),這個時候查詢的仍然是未修改的數(shù)據(jù),這樣第二個窗口兩次查詢到的
都是未修改的數(shù)據(jù),數(shù)據(jù)保持一致,這就叫可重復(fù)讀!當(dāng)把第二個窗口的
事務(wù)提交之后,再次查詢才能夠查詢到提交之后的數(shù)據(jù)
4.serializable:串行化
可以解決所有的問題
當(dāng)?shù)谝粋€事物操作這張表,它會鎖住這張表,不讓另外的事務(wù)訪問,這
個事物會一直暫停在這里,除非第一個事物提交或者回滾
數(shù)據(jù)庫查詢隔離級別
select @@tx_isolation;
數(shù)據(jù)庫設(shè)置隔離級別,必須關(guān)閉當(dāng)前窗口之后才會生效
set global transaction isolation level 級別字符串;