你瞭解Spring事物控制特性嗎

一、事務特性

原子性:強調事務的不可分割
一致性:強調的是事務的執行的前後,數據的完整性要保持一致
隔離性:一個事務的執行不應該受到其他事務的干擾
持久性:事務一旦結束(提交/回滾)數據就持久保持到了數據庫

二、如果不考慮隔離性,會引發一些安全性問題

                                                                      讀問題

髒讀:一個事務讀到另一個事務還沒有提交的數據
不可重複讀:一個事務讀到了另一個事務已經提交的update數據,導致在當前的事務中多次查詢數據不一致
虛讀/幻讀:一個事務讀到另一個事務已經insert數據,導致當前事務中多次查詢結果不一致

                                    寫問題

引發兩類丟失更新

三、解決引發的讀問題

                                                             設置事務的隔離級別

read uncommitted :未提交讀。髒讀,不可重複讀,虛讀都可能發生
read committed :已提交讀。避免髒讀,不可重複讀和虛度有可能發生

repeatable read :可重複讀。避免髒讀和不可重複讀,虛讀可能發生
serializable :串行化的。避免髒讀,不可重複讀,虛讀的發生

select @@tx_isolation; 查看隔離級別
set session transaction isolation level 級別; 設置隔離級別

四、演示讀問題

                                                                                     演示髒讀

1.分別開啓兩個dos窗口 A.B
2.先查看兩個窗口的隔離級別 select @@tx_isolation;
3.設置A窗口的隔離級別爲未提交讀 set session transaction isolation level read uncommitted;

4.分別在兩個窗口開啓事務 start transaction;
5.分別開啓兩個dos窗口 A.B

update account set money = money - 1000 where name = '張森';
update account set money = money + 1000 where name = '鳳姐';

6.在A窗口查詢數據select * from account; -- A事務讀到了B事務還沒有提交的數據;

                              演示避免髒讀,演示不可重複讀發送

1.分別開兩個窗口,A.B
2.設置A窗口的隔離級別:read committed set session transaction isolation level read committed;
3.分別在兩個窗口開啓事務 start transaction;
4.在B窗口完成轉賬

update account set money = money - 1000 where name = '張森';
update account set money = money + 1000 where name = '鳳姐';

5.在A窗口進行查詢 select * from account; -- 避免髒讀
6.在B窗口提交事務 commit;
7.在A窗口中再次查詢 ```
select * from account; -- 轉賬成功.(不可重複讀:一個事務讀到另一個事務中已經提交的update的數據,導致多次查詢結果不一致.)


                       避免髒讀和不可重複讀,演示虛讀
1.分別開啓兩個窗口,A.B

2.設置A窗口的隔離級別:
repeatable read set session transaction isolation level repeatable read;

3.分別在兩個窗口中開啓事務 start transaction;

4.在B窗口完成轉賬的操作 
update account set money = money - 1000 where name = '張森';
update account set money = money + 1000 where name = '鳳姐';

5.在A窗口查詢 select * from account; -- 轉賬沒有成功:避免髒讀.
6.在B窗口提交事務 commit;
7.在A```
窗口再次查詢 select * from account; -- 轉賬沒有成功:避免不可重複讀.

                                                  避免虛讀

1.分別開啓兩個窗口,A.B
2.設置A窗口的隔離級別:repeatable read ```
set session transaction isolation level repeatable read;

3.分別在兩個窗口中開啓事務 start transaction;
4.在B窗口完成插入操作 insert into account values (null,'王老師',10000)
5.在A中進行查詢操作 select * from account; -- 沒有查詢到任何結果
6.在B窗口提交事務 commit; -- A窗口馬上就會顯示數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章