MySQL數據庫筆記8——事務

1. 例題:取得每個部門最高薪水的人員名稱?
第一步:取得每個部門最高薪水
select max(sal),deptno from emp group by deptno;
第二步:將以上結果當作臨時表t,t表和emp表進行連接
select e.ename,t.* from emp e join (select max(sal) maxsal,deptno from emp group by deptno) t on e.deptno=t.deptno and e.sal=t.maxsal;

2. 事務
2.1 什麼是事務?
一個事務是一個完整的業務邏輯單元,不可再分。

比如:銀行賬戶轉賬,從A賬戶向B賬戶轉賬10000,需要執行兩條update語句:
      update t_act set balance=balance-10000 where actno=‘act-001’;
      update t_act set balance=balance+10000 where actno=‘act-002’;

      以上兩條DML語句必須同時成功,或者同時失敗,不允許出現一條成功,一條失敗。要想保證以上兩條DML語句同時成功或者同時失敗,那麼就需要使用數據庫的“事務機制”。

2.2 和事務相關的語句只有DML語句。(insert、delete、update)
爲什麼?因爲它們這三個語句都是和數據庫表當中的“數據”相關的。
事務的存在是爲了保證數據的完整性、安全性。

2.3 假設所有的業務都能使用1條DML語句搞定,還需要事務機制嗎? 不需要。
然而,實際上,通常一個“業務”需要多條DML語句共同聯合完成。
在這裏插入圖片描述
2.4 事務的特性
事務包括四大特性:ACID
A:原子性:事務是最小的工作單元,不可再分。
C:一致性:事務必須保證多條DML語句同時成功或者同時失敗。
I:隔離性:事務A與事務B之間具有隔離。
D:持久性:持久性指最終數據必須持久化到硬盤文件中,事務纔算成功的結束。

2.5 關於事務之間的隔離性
      事務隔離性存在隔離級別,理論上隔離級別包括4個:

  • 第一級別:讀未提交(read uncommitted):對方事務還沒有提交,我們當前事務可以讀取到對方未提交的數據。
    讀未提交存在髒讀(Dirty Read)現象:表示讀到了髒數據。
  • 第二級別:讀已提交(read committed):對方事務提交之後的數據我方可以讀取到。
    這種隔離級別解決了:髒讀現象。
    讀已提交存在的問題:不可重複讀。
  • 第三級別:可重複讀(repeatable read)
    這種隔離級別解決了:不可重複讀問題。
    這種隔離級別存在的問題是:讀取到的數據都是幻想。
  • 第四級別:序列化讀/串行化讀(serializable)
    解決了所有問題。
    存在的不足:效率低,需要事務排隊。

Oracle數據庫默認的隔離級別是:第二級別(讀已提交);
MySQL數據庫默認的隔離級別是:第三級別(可重複讀)。

3.演示事務
* MySQL事務默認情況下是自動提交的。即只要執行任意一條DML語句則提交一次。如何關閉自動提交?start transaction;

* 準備表
create table t_user(
      id int primary key auto_increment,
      username varchar(255)
);

* 演示
insert into t_user(username) values(‘zs’);
start transaction;
insert into t_user(username) values(‘ls’);
insert into t_user(username) values(‘ww’);
select * from t_user;
在這裏插入圖片描述
rollback;
select * from t_user;
在這裏插入圖片描述
start transaction;
insert into t_user(username) values(‘rose’);
insert into t_user(username) values(‘jack’);
commit;
select * from t_user;
在這裏插入圖片描述
rollback;
select * from t_user;
在這裏插入圖片描述
4.演示使用隔離級別
設置事務的全局隔離級別:
      set global transaction isolation level read uncommitted;
查看事務的全局隔離級別:
      select @@global.tx_isolation;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章