一.事務(wù)含義
一個(gè)或一組sql語句組成一個(gè)執(zhí)行單元,這個(gè)執(zhí)行單元要么全部執(zhí)行,要么全部不執(zhí)行。
2.事務(wù)概念
1.在mysql中的數(shù)據(jù)用各種不同的技術(shù)存儲在文件(或內(nèi)存)中。
2.通過show engines;來查看mysql支持的存儲引擎。
二.事務(wù)的特點(diǎn)(ACID)
- A 原子性(Atomicity)
一個(gè)事務(wù)不可再分割,要么都執(zhí)行要么都不執(zhí)行
- C 一致性(Consistency)
一個(gè)事務(wù)執(zhí)行會使數(shù)據(jù)從一個(gè)一致狀態(tài)切換到另外一個(gè)一致狀態(tài)
- I 隔離性(Isolation)
一個(gè)事務(wù)不受其他事務(wù)的干擾,多個(gè)事務(wù)互相隔離的
- D 持久性(Durability)
一個(gè)事務(wù)一旦提交,則會永久的改變數(shù)據(jù)庫的數(shù)據(jù).
三、事務(wù)的使用步驟 ★
了解:
隱式(自動)事務(wù):
沒有明顯的開啟和結(jié)束,本身就是一條事務(wù)可以自動提交,比如insert、update、delete
顯式事務(wù):具有明顯的開啟和結(jié)束
使用顯式事務(wù):
①開啟事務(wù)
set autocommit=0;
start transaction;#可以省略
②編寫一組邏輯sql語句
注意:sql語句支持的是insert、update、delete
設(shè)置回滾點(diǎn):
savepoint 回滾點(diǎn)名;
③結(jié)束事務(wù)
提交:commit;
回滾:rollback;
回滾到指定的地方:rollback to 回滾點(diǎn)名;
四、并發(fā)事務(wù)
1、事務(wù)的并發(fā)問題是如何發(fā)生的?
多個(gè)事務(wù) 同時(shí) 操作 同一個(gè)數(shù)據(jù)庫的相同數(shù)據(jù)時(shí)
2、并發(fā)問題都有哪些?
臟讀:一個(gè)事務(wù)讀取了其他事務(wù)還沒有提交的數(shù)據(jù),讀到的是其他事務(wù)“更新”的數(shù)據(jù)
不可重復(fù)讀:一個(gè)事務(wù)多次讀取,結(jié)果不一樣
幻讀:一個(gè)事務(wù)讀取了其他事務(wù)還沒有提交的數(shù)據(jù),只是讀到的是 其他事務(wù)“插入”的數(shù)據(jù)
3、如何解決并發(fā)問題
通過設(shè)置隔離級別來解決并發(fā)問題
4、隔離級別

幾種事務(wù)隔離級別會出現(xiàn)問題匯總
| 級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
|---|---|---|---|
| read uncommitted:讀未提交 | √ | √ | √ |
| read committed:讀已提交 | × | √ | √ |
| repeatable read:可重復(fù)讀 | × | × | √ |
| serializable:串行化 | × | × | × |
mysql中默認(rèn) 第三個(gè)隔離級別 repeatable read
oracle中默認(rèn)第二個(gè)隔離級別 read committed
例子1.演示事務(wù)的使用步驟
#開啟事務(wù)
SET autocommit=0;
START TRANSACTION;
#編寫一組事務(wù)的語句
UPDATE account SET balance = 1000 WHERE username='張無忌';
UPDATE account SET balance = 1000 WHERE username='趙敏';
#結(jié)束事務(wù)
ROLLBACK;#回滾
#commit;提交
SELECT * FROM account;
演示事務(wù)對于delete和truncate的處理的區(qū)別
delete可回滾truncate不可回滾
SET autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;
演示savepoint 的使用
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#設(shè)置保存點(diǎn)
DELETE FROM account WHERE id=28;
ROLLBACK TO a;#回滾到保存點(diǎn)
SELECT * FROM account;