Transaction

事務的概念:數據庫

事務指邏輯上的一組操做,組成這組操做的各個單元,要麼所有成功,要麼所有不成功。

事務的特性:併發

A:原子性(Atomicity):說明事務是一個不可分割的單位。
C:一致性(Consistency):事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態.(好比轉帳)
*I:隔離性(Isolation):一個事務不能被其餘事務打擾。
D:持久性(Durability):事務一旦提交,就應該被永久保存起來。

事務的隔離級別:性能

未提交讀(READ UNCOMMITTED):髒讀、不可重複讀、虛讀都有可能發生。	(隔離級別最低,併發性能高) 
提交讀/不可重複讀(READ COMMITTED):能避免髒讀,不可重複讀、虛讀都有可能發生。 (鎖定正在讀取的行 ,Oracle默認的隔離級別)
可重複讀(REPEATABLE READ):能避免髒讀、不可重複度,虛讀有可能發生。	(鎖定所讀取的全部行 ,MySQL默認的隔離級別)
可串行化(SERIALIZABLE):能避免髒讀、不可重複度、虛讀。	(鎖表)

說明:線程

1)多個線程開啓各自事務操做數據庫中數據時,數據庫系統要負責隔離操做,以保證各個線程在獲取數據時的準確性。
2)MySQL中Innodb引擎經過數據庫鎖(表鎖和行鎖)來實現事務的隔離。
3)若是不考慮事務的隔離級別,會出現如下「不正確」的狀況:
	1>髒讀:指一個事務讀到了另外一個事務中未提交的數據。
	2>不可重複讀:在一個事務內讀取表中的某一行數據,屢次讀取的結果不一樣。重點是修改
		注:不可重複讀和髒讀的區別是:髒讀是讀取了另外一個事務中未提交的髒數據,不可重複讀是讀取了另外一個事務已提交了的數據。
	3>虛讀(幻讀):在一個事務內讀取到了另外一個事務插入的數據,致使先後讀取的記錄數不一致。重點在於新增或者刪除

JDBC中設置事務的隔離級別:code

Connection.setTransactionIsolation(int level); // Level:Connection中的常量

// 在開啓事務前先設置隔離級別
Conn.setTransactionIsolation(Connection.*);
Conn.setAutoCommit(false);

MySQL中控制事務隔離級別的語句:事務

查看當前事務的隔離級別:	select @@tx_isolation;
設置當前事務隔離級別:		set transaction isolation level 隔離級別;
相關文章
相關標籤/搜索