Jdbc 与 Jta 事务

hibernate的两种事务管理jdbc 和jta方式。下边说说两者的区别
一、说明一下jdbc和jta方式事务管理的区别:
JDBC事务由Connnection管理,也就是说,事务管理实际上是在JDBC Connection
中实现。事务周期限于Connection的生命周期之内

JTA 事务管理则由 JTA 容器实现,JTA 容器对当前加入事务的众多Connection 进
行调度,实现其事务性要求。JTA的事务周期可横跨多个JDBC Connection生命周期。

二、在了解jdbc和jta事务的基础上,再来讨论hibernate的两种事务
对于基于JDBC Transaction的Hibernate 事务管理机制而言,事务管理在Session 所依托的JDBC Connection
中实现,事务周期限于Session的生命周期。

对于基于JTA事务的Hibernate而言,JTA事务横跨可横跨多个Session。
三、hibernate中写法的不同

jdbc的写法
public void saveUser() {
     Session session
= sessionFactory.openSession();
     Transaction tx
= session.beginTransaction();
     session.save(user);
     tx.commit();
     session.close();
}

必须在session.close()之前commit或者rollback

jta写法
public void saveUser() {
     Session session
= sessionFactory.openSession();
     Transaction tx
= session.beginTransaction();
    
     session.save(user);
     session.close();
    
     Session session1
= sessionFactory.openSession();
     session1.save(user1);
     session.close();
    
     tx.commit();
}

commit和rollback可以在session.close()之后执行.
同时应该注意的一点是,事务是不能嵌套的,在使用jta的事务的情况下,如果要让一个事务跨越两个
session,则必须在两个session的外层开始事务和完成事务。而不能再在session内部开始事务和完成事务。
  1. 、JDBC事务和JTA事务   
  2.     Hibernate本身没有事务管理功能,它依赖于JDBC或JTA的事务管理功能,在Hibernate配置文件中,如果不显式指定 Transaction的工厂类别属性hibernate.transaction.factory_class的配置,则默认为JDBC事务:   
  3.     <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory< /property>。   
  4.     在通过SessionFactory获取到Session后,与Session相关联的JDBC Connection实例就被设定为false。   
  5.   
  6.     特别注意:如果数据库不支持事务,比如MySQL的MyISAM引擎的表就不支持事务,声明事务也不会起作用。要使MySQL5的表支持事务,则可以指定表的引擎类型为InnoDB。如果是学习或者研究,目前最好还是使用PostgreSQL 8.3或DB2、Oracle。   
  7. JDBC事务总是和一个数据库连接(或一个Session)相关联的。   
  8.     JTA事务则可以跨越多个数据连接(或多个Session),这些连接还可以是不同数据库的连接,JTA事务一般由容器进行管理。编程只要在多个操作单元的开始和结束定义JTA事务的边界即可。   
  9.   
  10.     特别注意:如果使用了JTA事务,则不能再用在JDBC式的事务来管理每个Session的操作,否则会出错。为了程序的的通用性,一般来说,都是使用 JTA事务来构建应用,这使用任何环境。当然,也可以使用事务代理为每个JDBC的操作方法加入事务控制。这样也为程序以后移植到JTA容器事务上带来很大方便。其实现在可以使用Spring的事务管理,与Hibernate结合的非常完美。   
  11. *****************************************   
  12. hibernate配置正确的情况下:   
  13.     
  14.       在服务层上:   
  15.                   一:如果通过HibernateDaoSupport来getSession  那么 这个session当一个方法结束的时候 就关闭了   
  16.                   二:如果通过HibenateDAOSupport 来getSessionFactory在opensession()那么就是   方法结束后不会关闭session需要自己手动的关闭   
  17.                   三:如果采用的是HibernateTemplate的hbiernatecallback 里面的session是当do..方法结束 就关闭session(不代表 马上就提交事务 这里以后讨论)   
  18.     
  19.   如果 没有配置正确:包括改业务逻辑 没有被spring的事务控制控制 则 上诉 不适用  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值