11.2.4. 事务超时

EJB这样的托管环境有一项极为重要的特性,而它从未在非托管环境中提供过,那就是事务超时。在出现错误的事务行为的时候,超时可以确保不会无限挂起资源、对用户没有交代。在托管(JTA)环境之外,Hibernate无法完全提供这一功能。但是,Hiberante至少可以控制数据访问,确保数据库级别的死锁,和返回巨大结果集的查询被限定在一个规定的时间内。在托管环境中,Hibernate会把事务超时转交给JTA。这一功能通过Hibernate Transaction对象进行抽象。

  1. Session sess = factory.openSession();
  2. try {
  3. //set transaction timeout to 3 seconds
  4. sess.getTransaction().setTimeout(3);
  5. sess.getTransaction().begin();
  6. // do some work
  7. ...
  8. sess.getTransaction().commit()
  9. }
  10. catch (RuntimeException e) {
  11. sess.getTransaction().rollback();
  12. throw e; // or display error message
  13. }
  14. finally {
  15. sess.close();
  16. }

注意setTimeout()不应该在CMT bean中调用,此时事务超时值应该是被声明式定义的。