MySQL事务的特性及事务隔离级别演示
事務的概述
事務的概念
事務:指的是邏輯上的一組操作,組成這組操作的各個邏輯單元,要么全都成功,要么全都失敗。
MySQL中的事務管理
環境準備
create table account(
????id int primary key auto_increment,
????name varchar(20),
????money double
);
?
insert into account values (null,'小張',10000);
insert into account values (null,'小鳳',10000);
轉賬案例
- 開啟事務:
start transaction;
- 提交事務
commit;
- 回滾事務
rollback;
- 提交事務
- 回滾事務
事務的特性:
原子性
原子性:事務的不可分割,組成事務的各個邏輯單元不可分割。
一致性
一致性:事務執行的前后,數據完整性保持一致。
隔離性
隔離性:事務執行不應該受到其他事務的干擾。
持久性
持久性:事務一旦結束,數據就持久化到數據庫中。
?
?
事務的隔離級別
如果不考慮隔離性,引發一些安全問題
隔離性:一個事務的執行,不應該受到其他事務的干擾。
如果不考慮隔離性(一個事務執行受到其他的事務的干擾),引發一些安全問題,主要體現在讀取數據上:
- 臟讀:一個事務讀到了另一個事務未提交的數據,導致查詢結果不一致
- 不可重復讀:一個事務讀到了另一個事務已經提交的update的數據,導致多次查詢結果不一致。
- 虛讀/幻讀:一個事務讀到了另一個事務已經提交的insert的數據,導致多次查詢結果不一致。
解決這些安全性問題:
設置事務的隔離級別:
- read uncommitted????:臟讀,不可重復讀,虛讀都有可能發生
- read committed????:避免臟讀。但是不可重復讀和虛讀是有可能發生
- repeatable read????:避免臟讀和不可重復讀,但是虛讀有可能發生。
- serializable????????:避免臟讀,不可重復讀,虛讀。
?
?
?
事務的隔離級別的演示-演示臟讀
- 開啟兩個窗口A,B
- 設置A窗口的隔離級別為read uncommitted;
SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;
- 在A,B兩個窗口中開啟事務
start transaction;
- 在B窗口中完成轉賬的功能:
update account set money = money - 1000 where name= '小張';
update account set money = money + 1000 where name= '小鳳';
***** 事務未提交!!!
- 在A窗口中進行查詢
select * from account;
*****發現A窗口中已經查詢到轉賬成功了!!!已經發生了臟讀:一個事務中已經讀到了另一個事務未提交的數據。
?
?
事務的隔離級別演示-避免臟讀,演示不可重復讀發生
- 開啟兩個窗口A,B
- 設置A窗口的隔離級別為read committed;
SET SESSION TRANSACTION ISOLATION LEVEL read committed;
- 分別在兩個窗口中開啟事務:
start transaction;
- 在B窗口中完成轉賬
update account set money = money - 1000 where name= '小張';
update account set money = money + 1000 where name= '小鳳';
***** 沒有提交事務!!!
- 在A窗口中進行查詢:
select * from account;
***** 發現這個時候沒有轉賬成功!!!(沒有查詢到另一個事務未提交的數據:說明已經避免了臟讀)。
- 在B窗口中提交事務
commit;
- 在A窗口查詢
select * from account;
***** 發現這次的結果已經發生了變化!!!(已經發生不可重復讀:一個事務已經讀到了另一個事務提交的update的數據,導致多次查詢結果不一致。)
?
?
事務的隔離級別的演示-演示避免不可重復讀
- 分別開啟兩個窗口A,B
- 設置A窗口的隔離級別:repeatable read;
SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;
- 在A,B兩個窗口中開啟事務:
start transaction;
- 在B窗口完成轉賬
update account set money = money - 1000 where name= '小張';
update account set money = money + 1000 where name= '小鳳';
***** 未提交事務!!!
- 在A窗口中進行查詢
select * from account;
***** 發現沒有轉賬成功:說明避免臟讀!!!
- 在B窗口中提交事務
commit;
- 在A窗口中再次查詢:
?
***** 發現在一個事務中的多次查詢結果是一致!!!(已經避免不可重復讀)。
?
?
事務的隔離級別演示-演示串行化
- 開啟兩個窗口A,B
- 設置A窗口的隔離級別:serializable
SET SESSION TRANSACTION ISOLATION LEVEL serializable;
- 分別在兩個窗口中開啟事務:
start transaction;
- 在B窗口中插入一條記錄
insert into account values (null,'小李',10000);
- 在A窗口中進行查詢
select * from account;
*****發現A窗口已經卡住了(說明事務不允許出現并發,A窗口需要等待B窗口事務執行完成以后,才會執行A窗口的事務。)當B窗口的事務結束(提交或者回滾),那么A窗口馬上就會出現結果。
總結
以上是生活随笔為你收集整理的MySQL事务的特性及事务隔离级别演示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL多表查询实例
- 下一篇: SQL update select结合语