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.

事务级别越高,效率越低。

一般使用read-commited事务隔离级别,如果在程序中没有指定事务隔离级别,则使用数据库系统默认的级别。

Hibernate事务隔离级别:

隔离级别

脏读 (Dirty Read)

不可重复读(NonRepeatable Read)

幻读 Phantom Read

读操作未提交 (Read uncommitted)

可能

可能

可能

读操作已提交 (Read commited)

不可能

可能

可能

可重复读 (Repeatable read)

不可能

不可能

可能

可串行化 Serializable

不可能

不可能

不可能

设置隔离级别:
<property name=”hibernate.connection.isolation”>4</property> //可填1,2,4(不可重复读),8
 
在以下的情况下,Hibernate会调用flush():
(1)    事务提交时,如果flush模式不为FlushMode.NEVER, commit()将调用flush().
(2)    在某些查询语句之前(此查询语句已经改变了数据库状态,所以需要调用flush()以同步数据,使查出来的数据是经过更改的)
(3)    当程序强制调用session.flush时。
在一个事务中调用一个select 查询,如果此查询之前已经有某个update语句做了数据修改(注意此update语句并没有真正执行),则首先会调用flush(),使update对数据库操作成功,接着才返回查询数据。
FlushMode有以下几种:
(1)       FlushMode.AUTO: 数据有更改,则在查询前更新此改动,以保证数据同步.
(2)       FlushMode.COMMIT:  在事务结束之前刷新session
(3)       FlushMode.NEVER: 仅在明确调用flush()时才对数据库进行同步.
 
在Hibernate中使用JDBC事务:
Hibernate.transaction.factory_class=net.sf.hibernate.transaction.JDBCTransactionFactory
 
使用JTA 事务:
       在一个具有多个数据库的系统中,可能一个程序将会调用几个数据库中的数据,需要一种分布式事务,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTATransaction.
 
Hibernate中对数据的锁定:
如果要在事务中使用悲观锁,则可以像下面这样写:
Transaction tx=session.beginTransaction();
//取得持久化User对象,并使用LockMode.UPGRADE模式锁定对象
User user=(User)session.get(User.class,LockMode.UPGRADE);
 user.setName(“newName”);  //更改对象属性,注意并不需要使用session.save(user)
tx.commit();
这样的话,Hibernate会使用select …… for update 语句载入User类,并且锁住了这个对象在数据库中的列,直到事务完成(commit()以后)。
 
Hibernate 可以利用Query或者Criteria的setLockMode()方法来设定要锁定的表或列(Row)及其锁定模式。可设定的模式有两个:
(1)       LockMod.UPGRADE
(2)       LockMode.UPDGRADE_NOWAIT: