Field Summary |
static int |
TRANSACTION_NONE A constant indicating that transactions are not supported. |
static int |
TRANSACTION_READ_COMMITTED A constant indicating that dirty reads are prevented; non-repeatable reads and phantom reads can occur. |
static int |
TRANSACTION_READ_UNCOMMITTED A constant indicating that dirty reads, non-repeatable reads and phantom reads can occur. |
static int |
TRANSACTION_REPEATABLE_READ A constant indicating that dirty reads and non-repeatable reads are prevented; phantom reads can occur. |
static int |
TRANSACTION_SERIALIZABLE A constant indicating that dirty reads, non-repeatable reads and phantom reads are prevented. |
事務(wù)級(jí)別越高,效率越低。
一般使用read-commited事務(wù)隔離級(jí)別,如果在程序中沒有指定事務(wù)隔離級(jí)別,則使用數(shù)據(jù)庫(kù)系統(tǒng)默認(rèn)的級(jí)別。
Hibernate事務(wù)隔離級(jí)別:
隔離級(jí)別
|
臟讀 (Dirty Read)
|
不可重復(fù)讀(NonRepeatable Read)
|
幻讀 (Phantom Read)
|
讀操作未提交 (Read uncommitted)
|
可能
|
可能
|
可能
|
讀操作已提交 (Read commited)
|
不可能
|
可能
|
可能
|
可重復(fù)讀 (Repeatable read)
|
不可能
|
不可能
|
可能
|
可串行化 (Serializable)
|
不可能
|
不可能
|
不可能
|
設(shè)置隔離級(jí)別:
<property name=”hibernate.connection.isolation”>4</property> //可填1,2,4(不可重復(fù)讀),8
在以下的情況下,Hibernate會(huì)調(diào)用flush():
(1) 事務(wù)提交時(shí),如果flush模式不為FlushMode.NEVER, commit()將調(diào)用flush().
(2) 在某些查詢語(yǔ)句之前(此查詢語(yǔ)句已經(jīng)改變了數(shù)據(jù)庫(kù)狀態(tài),所以需要調(diào)用flush()以同步數(shù)據(jù),使查出來(lái)的數(shù)據(jù)是經(jīng)過(guò)更改的)
(3) 當(dāng)程序強(qiáng)制調(diào)用session.flush時(shí)。
在一個(gè)事務(wù)中調(diào)用一個(gè)select 查詢,如果此查詢之前已經(jīng)有某個(gè)update語(yǔ)句做了數(shù)據(jù)修改(注意此update語(yǔ)句并沒有真正執(zhí)行),則首先會(huì)調(diào)用flush(),使update對(duì)數(shù)據(jù)庫(kù)操作成功,接著才返回查詢數(shù)據(jù)。
FlushMode有以下幾種:
(1) FlushMode.AUTO: 數(shù)據(jù)有更改,則在查詢前更新此改動(dòng),以保證數(shù)據(jù)同步.
(2) FlushMode.COMMIT: 在事務(wù)結(jié)束之前刷新session
(3) FlushMode.NEVER: 僅在明確調(diào)用flush()時(shí)才對(duì)數(shù)據(jù)庫(kù)進(jìn)行同步.
在Hibernate中使用JDBC事務(wù):
Hibernate.transaction.factory_class=net.sf.hibernate.transaction.JDBCTransactionFactory
使用JTA 事務(wù):
在一個(gè)具有多個(gè)數(shù)據(jù)庫(kù)的系統(tǒng)中,可能一個(gè)程序?qū)?huì)調(diào)用幾個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù),需要一種分布式事務(wù),或者準(zhǔn)備用JTA來(lái)管理跨Session的長(zhǎng)事務(wù),那么就需要使用JTATransaction.
Hibernate中對(duì)數(shù)據(jù)的鎖定:
如果要在事務(wù)中使用悲觀鎖,則可以像下面這樣寫:
Transaction tx=session.beginTransaction();
//取得持久化User對(duì)象,并使用LockMode.UPGRADE模式鎖定對(duì)象
User user=(User)session.get(User.class,LockMode.UPGRADE);
user.setName(“newName”); //更改對(duì)象屬性,注意并不需要使用session.save(user)
tx.commit();
這樣的話,Hibernate會(huì)使用select …… for update 語(yǔ)句載入U(xiǎn)ser類,并且鎖住了這個(gè)對(duì)象在數(shù)據(jù)庫(kù)中的列,直到事務(wù)完成(commit()以后)。
Hibernate 可以利用Query或者Criteria的setLockMode()方法來(lái)設(shè)定要鎖定的表或列(Row)及其鎖定模式。可設(shè)定的模式有兩個(gè):
(1) LockMod.UPGRADE
(2) LockMode.UPDGRADE_NOWAIT: