1)事務的基本介紹:
(1)介紹:如果包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗
如:張三給李四轉賬500元,3個業務操作
1.查詢張三賬戶餘額是否大於500
2.張三賬戶 金額-500
3.李四賬戶 金額+500
但是: 如果這3個操作沒有被事務管理的話,某一步出現了異常,500元就不翼而飛了.
演示:
start transaction;
update account set balance = balance - 500 where name = 'zhangsan';
異常
update account set balance = balance + 500 where name = 'lisi';
rollback; -- 回滾
commit; -- 提交
(2)操作
控制檯默認編碼是gbk 數據是:utf8 中文的話,是會亂碼;
開啓事務:start transaction
回滾:rollback
提交:commit
(3)mysql中,事務默認自動提交一次事務
事務提交的2種方式:
自動提交: mysql就是自動提交的(也就是每個sql語句,都會提交一次事務)
手動提交: 需要先開啓事務,再提交
查詢提交方式:
select @@autocommit; --1 自動提交 0手動提交
修改默認提交方式: set @@autocommit = 0;
2)事務的4大特徵
(1)原子性: 是不可分割的最小單位
(2)持久性: 如果事務提交或者回滾,那麼數據庫的表數據會持久的更新。 哪怕你關機了, 數據也會持久保存在硬盤上。
(3)隔離性:多個事務之間,相互獨立。但是實際會產生影響,所以要了解事務的隔離級別
(4)一致性:事務操作前後數據總量不變
3)事務的隔離級別(瞭解)
(1)概念: 多個事務之間是隔離的,相互獨立的,但是如果多個事務操作同一批數據,則會引發一些問題,設置不同的隔離級別就可以解決這些問題。
(2)存在的問題:
1.髒讀:一個事務,讀取到另一個事務中沒有提交的數據
2.不可重複讀(虛讀):在同一個事務中,2次讀取到的數據不一樣
3.幻讀(mysql中看不到這種情況):一個事務操作(DML)數據表中所有記錄,另一個事務添加了一條數據,則第一個事務查詢不到自己的修改。
(3)4種隔離級別:
1.read uncommitted: 讀未提交
產生的問題: 髒讀、不可重複讀、幻讀
2.read committed: 讀已提交(已提交的數據,另一個事務才能讀到) oracle默認
產生的問題: 不可重複讀、幻讀
3.repeatable-read(可重複讀): mysql默認
產生的問題: 幻讀
4.serializable: 串行化(跟多線程加鎖一樣)
可以解決所有的問題
注意: 隔離級別從小到大,安全性越來越高,但是效率越來越低
4)數據庫設置默認隔離級別:
(1)查詢隔離級別: select @@tx_isolation;
(2)設置隔離級別: set global transaction isolation level 級別字符串;
5)演示(關鍵:在commit 前後,2個窗口進行查看;):
---1---
set global transaction isolation level read uncommitted;
start transaction;
update account set balance = balance - 500 where id = 1;
update account set balance = balance + 500 where id = 2;
1號窗口:左邊轉賬不提交
2號窗口: 查詢了,就直接查詢到了1沒有提交的事務.
1回滾後,2去取錢,發現取不出來
--》髒讀 和 不可重複度發生了
---2---
比如:我給領導看報表
---3---
當2號窗口commit後,才能查詢到1號窗口的更改
---4---
當1號窗口提交或者回滾後, 2號窗口的select才能查詢出來。 不然光標一直等着