hibernate初步3,hibernate
事務和並發
1.事務概念
一組不可分割的操作,事務有如下屬性(ACID 屬性:Atomic Consistent Isolated Durable)
(1)原子性---Atomic
事務的原子性指的是,事務中包含的程式作為資料庫的邏輯工作單位,它所做的對資料修改操作要麼全部執行,要麼完全不執行。
(2)一致性---Consistent
事務的一致性指的是在一個事務執行之前和執行之後事務操作的對象總狀態不變
(3)分離性---Isolated
分離性指並發的事務是相互隔離的。即一個事務內部的操作及正在操作的資料必須封鎖起來,不被其它企圖進行修改的事務看到。
(4)持久性---Durable
持久性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,DBMS保證它對資料庫中資料的改變應該是永久性的
2.事務並發問題
對於同時啟動並執行多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒有採取必要的隔離機制, 就會導致各種並發問題:
(1)髒讀:
對於兩個事務 T1, T2, T1 讀取了已經被 T2 更新但還沒有被提交的欄位。 之後, 若 T2 復原, T1讀取的內容就是臨時且無效的.
(2)不可重複讀取:
對於兩個事物 T1, T2, T1 讀取了一個欄位, 然後 T2 更新了該欄位. 之後, T1再次讀取同一個欄位, 值就不同了.
(3)幻讀:
對於兩個事物 T1, T2, T1 按照某個查詢條件從一個表中讀取記錄, 然後 T2 在該表中插入了一些新的行或者刪除某些行. 之後, T1 再次按相同查詢條件讀取同一個表, 讀到的記錄數不同
3.交易隔離等級
解決事務並發問題可以使用設定交易隔離等級,資料庫和應用程式都可以設定隔離等級
(1)資料庫的隔離等級
資料庫事務的隔離性: 資料庫系統必須具有隔離並發運行各個事務的能力, 使它們不會相互影響, 避免各種並發問題。
一個事務與其他事務隔離的程度稱為隔離等級. 資料庫規定了多種交易隔離等級, 不同隔離等級對應不同的幹擾程度, 隔離等級越高, 資料一致性就越好,
但並發性越弱。
SQL ANSI SQL 標準定義了 4 種交易隔離等級,層級越高,成本越高:
4種隔離等級圖片
註:
Oracle 只支援 2 種交易隔離等級:READ COMMITED, SERIALIZABLE. Oracle 預設的交易隔離等級為: READ COMMITED
Mysql 支援4中交易隔離等級。Mysql 預設的交易隔離等級為: REPEATABLE READ
(2)在 MySql 中設定隔離等級
(1)每啟動一個 mysql 程式, 就會獲得一個單獨的資料庫連接. 每個資料庫連接都有一個全域變數 @@tx_isolation, 表示當前的交易隔離等級. MySQL 預設的隔離等級為 Repeatable Read
(2)mysql設定手動提交/自動認可事務:set autocommit=0(手動提交)/1(自動認可)
(3)查看當前的隔離等級:
1)當前串連:SELECT @@tx_isolation;
2)全域:SELECT @@global.tx_isolation;
(4)設定當前 mySQL 串連的隔離等級:
1)set transaction isolation level read committed;
2)set session transaction isolation level read uncommitted;
(5)設定資料庫系統的全域的隔離等級:
set global transaction isolation level read committed;
(3)在 Hibernate 中設定隔離等級
JDBC 資料庫連接使用資料庫系統預設的隔離等級. 在 Hibernate 的設定檔中可以顯式的設定隔離等級. 每一個隔離等級都對應一個整數:
隔離等級 對應的整數表示
READ UNCOMMITED 1
READ COMMITED 2
REPEATABLE READ 4
SERIALIZEABLE 8
Hibernate 通過為 Hibernate 對應檔指定 hibernate.connection.isolation 屬性來設定事務的隔離等級。例:hibernate.connection.isolation = 4
注意:
Hibernate不可能改變在受管環境下由應用伺服器提供的資料庫連接的隔離等級,只能通過改變應用伺服器配置的方式來改變.
設定隔離等級是全域選項,會影響所有的串連和事務