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: