究竟什么是Transaction事务

本文详细介绍了在J2EE框架中Transaction的概念、类型及其使用方法,包括Bean-ManagedTransaction、JDBCTransaction、JTATransaction和Container-ManagedTransaction,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Transaction不管在WEB开发还是数据库中都是相当重要的概念。在WEB开发框架中Transaction的实现方面却有着很多的不同。下面以J2EE介绍Transaction。

一、 Transaction是什么

Transaction是指一系列不可分割的改动数据库的操作。这里的“一系列”操作指的是一组SQL语句;“不可分割”就意味着一致性和完整性,要么这一系列操作全部commit(提交),要么就全部rollback(回滚)。(如果一系列的操作只包含enquiry操作,那么这些操作也不是Transaction) 所以常见的代码结构

    public void save(User user) {
    Session s = sessionFactory.openSession();
    s.beginTransaction();
    s.save(user);
    //…
    s.getTransaction().commit();
    s.close();
    }

二、在J2EE中,Transaction主要有几大类,具体有几种?

在J2EE中,Transaction主要有

  • Bean-Managed Transaction
    • JDBC Transaction
    • JTA Transaction
  • Container-Managed Transaction

三、JDBC Transaction

  1. 定义
    JDBC Transaction是指由Database本身去管理的事务。通过显示调用Connection接口的commit和rollback方法来完成事务的提交和回滚。事务结束的边界是commit或者rollback方法的调用,开始的边界于组成当前事务的所有statement中的第一个被执行的时候。
  2. 使用
    使用JDBC Transaction的顺序是获取session(tx = session.beginTransaction()),提交(tx.commit),关闭session(session.close())
  3. 代码示例

    Session session = sf.openSession(); 
    Transaction tx = session.beginTransactioin(); 
    ... 
    session.flush(); 
    tx.commit(); 
    session.close();
    

四、JTA Transaction

  1. 定义
    JTA Transaction是指由J2EE Transaction manager去管理的事务。是调用UserTransaction接口的begin,commit和rollback方法来完成事务范围的界定,事务的提交和回滚。JTA Transaction可以实现同一事务对应不同的数据库,但是它仍然无法实现事务的嵌套。
  2. 使用
    如果需要在EJB中使用Hibernate,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTA Transaction。使用JTA Transaction的顺序是先启动Transaction,然后启动Session,关闭Session,最后提交Transaction
  3. 代码示例

    public void withdrawCash(double amount) {
        UserTransaction ut = context.getUserTransaction();
        try {
           ut.begin();
           updateChecking(amount);
           machineBalance -= amount;
           insertMachine(machineBalance);
           ut.commit();
        } catch (Exception ex) {
            try {
               ut.rollback();
            } catch (SystemException syex) {
                throw new EJBException
                   ("Rollback failed: " + syex.getMessage());
            }
            throw new EJBException 
               ("Transaction failed: " + ex.getMessage());
         }
    }
    

五、Container-Managed Transaction

Container-Managed Transaction,就是由Container(容器)负责管理的Transaction。其最大的特点是不需要显式界定事务的边界,也不需要显式的提交或者回滚事务,这一切都由Container来替我们完成。我们需要做的就是设定在一个Bean中,哪些方法是跟事务相关的,同时设定它们的Transaction Attribute既可。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/coderfish/p/4875471.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值