20160515-hibernate--事务
事务
JDBCTransaction
单个数据库(一个SesisonFactory对应一个数据库),由JDBC实现。
Session session = null; Transaction tx =null; try { session = sessionFactory.openSession(); tx = session.beginTransaction(); //process tx.commit(); } catch(HibernateException e){ if(tx != null)tx.rollback();throw e; }finally { if (session != null)session.close(); } connection.setAutoCommit(false); connection.commit();conn.rollback();
JTATransaction
可以简单的理解成跨数据库的事物,由应用JTA 容器实现;使用JTATransaction需要配置hibernate.transaction.factory_class参数,该参数缺省值是org.hibernate.transaction. JDBCTransactionFactory,当使用JTATransaction时需要将该参数改成org.hibernate.transaction.JTATransactionFactory,并配置jta.UserTransaction参数JNDI名(Hibernate在启动JTATransaction时要用该值到JNDI的上下文Context中去找javax.transaction.UserTransaction)。
javax.transaction.UserTransactin tx = context.lookup(“jndiName”); try{ tx.begin(); //多个数据库的session操作; //session1…. //session2…. tx.commit(); }catch(Exception e){ tx.rollback(); throw e; }
session context和事务边界
用current_session_context_class属性来定义context(用sessionFactory.getCurrentSession()来获得session),其值为:
1.thread:ThreadLocal来管理Session实现多个操作共享一个Session,避免反复获取Session,并控制事务边界,此时session不能调用close当commit或rollback的时候session会自动关闭(connection.release_mode:after_transaction)。
Open session in view:在生成(渲染)页面时保持 session打开。
2.jta:由JTA事务管理器来管理事务(connection.release_mode:after_statement)。
悲观锁和乐观锁
悲观锁由数据库来实现;乐观锁hibernate用version和timestamp来实现