一、Mysql事務 事務: 事務指邏輯上的一組操作,組成這組操作的各個單元,要麼全部成功,要麼全部不成功。 1、Mysql中的事務 a、mysql引擎是支持事務的 b、mysql預設自動提交事務。每條語句都處在單獨的事務中。 c、手動控制事務 開啟事務:start transaction | beg ...
一、Mysql事務
事務:
事務指邏輯上的一組操作,組成這組操作的各個單元,要麼全部成功,要麼全部不成功。
1、Mysql中的事務
a、mysql引擎是支持事務的
b、mysql預設自動提交事務。每條語句都處在單獨的事務中。
c、手動控制事務
開啟事務:start transaction | begin
提交事務:commit
回滾事務:rollback
2、JDBC如何控制事務
3、事務的特性(面試題)
原子性:指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
一致性:事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。轉賬前和轉賬後的總金額不變。
隔離性:事務的隔離性是多個用戶併發訪問資料庫時,資料庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個併發事務之間要相互隔離。
持久性:指一個事務一旦被提交,它對資料庫中數據的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。
4、事務的隔離級別
贓讀:指一個事務讀取了另一個事務未提交的數據。
不可重覆讀:在一個事務內讀取表中的某一行數據,多次讀取結果不同。一個事務讀取到了另一個事務提交後的數據。(update)
虛讀(幻讀):是指在一個事務內讀取到了別的事務插入的數據,導致前後讀取不一致。 (insert)
資料庫通過設置事務的隔離級別防止以上情況的發生:
* 1、READ UNCOMMITTED: 贓讀、不可重覆讀、虛讀都有可能發生。
* 2、READ COMMITTED: 避免贓讀。不可重覆讀、虛讀都有可能發生。(oracle預設的)
* 4、REPEATABLE READ:避免贓讀、不可重覆讀。虛讀有可能發生。(mysql預設)
* 8、SERIALIZABLE: 避免贓讀、不可重覆讀、虛讀。
級別越高,性能越低,數據越安全
mysql中:
查看當前的事務隔離級別:SELECT @@TX_ISOLATION;
更改當前的事務隔離級別:SET TRANSACTION ISOLATION LEVEL 四個級別之一。
設置隔離級別必須在事務之前
練習:設置事務的隔離級別為 read uncommitted
時間 |
線程1 |
線程2 |
說明 |
t1 |
begin; |
|
|
t2 |
select * from account where name='zs'; 結果1000塊 |
|
|
t3 |
|
begin; |
|
t4 |
|
update account set money=money+100 where name='zs'; |
|
t5 |
select * from account where name='zs'; 結果1100塊 |
|
讀到了另一個線程未提交事務的數據。贓讀發生了 |
t6 |
|
commit; |
|
t7 |
select * from account where name='zs'; 結果1100塊 |
|
讀到了另一個線程提交事務的update數據。不可重覆讀發生了 |
t8 |
|
insert into account values(4,'zl',1000); 執行insert語句插入數據,事務自動提交了 |
|
t9 |
select * from account; 查到4條數據 |
|
讀到了另一個線程自動提交事務的insert語句數據。虛讀發生了 |
t10 |
commit; |
|
|
5、JDBC控制事務的隔離級別
Connection介面:
設置隔離級別:必須在開啟事務之前。