Skip to content

TransactionContext和PlatformTransactionManager是两种不同的事务管理方式,它们在实现和使用上有一些关键的区别。这两种方法的区别:

TransactionContext

  1. 自定义事务管理:

TransactionContext是你自定义的事务管理类,它直接操作JDBC连接来控制事务。 你手动调用beginTransaction()、commit()和rollback()方法来控制事务的开始、提交和回滚。 这种方式更接近于底层的JDBC操作,提供了更细粒度的控制。

  1. 依赖性:

TransactionContext依赖于你的数据库连接池(如DBConnectionManager)来获取和释放连接。 你需要自己处理连接的获取、释放和异常情况下的回滚。

  1. 代码示例:
java
TransactionContext tc = new TransactionContext(DBConnectionManager.DB_POOL_MYSQL);
BaseDAO dao = new BaseDAO(tc);
String sql = 
    "INSERT INTO api_mt_003" +
    "(SM_ID,SRC_ID,MOBILES,CONTENT,IS_WAP,URL,SEND_TIME,SM_TYPE,MSG_FMT,TP_PID,TP_UDHI,FEE_TERMINAL_ID,FEE_TYPE,FEE_CODE,FEE_USER_TYPE) " +
    "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
PreparedStatement ps = null;
try {
    for (ApiMt m: list) {
        try {
            ps = dao.prepareStatement(sql);
            int i = 1;
            ps.setLong(i++, m.getSmId());
            ps.setLong(i++, m.getSrcId());
            ps.setString(i++, m.getMobiles());
            ps.setString(i++, new String(m.getContent().getBytes("GBK"), "ISO8859_1"));
            ps.setByte(i++, m.getIsWap());
            ps.setString(i++,m.getUrl());
            ps.setTimestamp(i++, new Timestamp(m.getSendTime().getTime()));
//					ps.setDate(i++, null); // 测试
            ps.setByte(i++, m.getSmType());
            ps.setInt(i++, m.getMsgFmt());
            ps.setByte(i++, m.getTpPid());
            ps.setByte(i++, m.getTpUdhi());
            ps.setString(i++, m.getFeeTerminalId());
            ps.setString(i++, m.getFeeType());
            ps.setString(i++, m.getFeeCode());
            ps.setInt(i++, m.getFeeUserType());
            ps.executeUpdate();
            m.setStatus(SMSService.SUCCESS);
        } catch(Exception e) {
            m.setStatus(SMSService.FAILED);
            e.printStackTrace();
        }
        resultList.add(m);
    }
} finally {
    try {
        if(ps != null) ps.close();
        if(tc != null) tc.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

tc.beginTransaction();
tc.rollback();
tc.commit();

你已经在代码中展示了如何使用TransactionContext来管理事务。这种方式需要你在业务逻辑中显式地管理事务的生命周期。

  1. 适用场景:

适用于需要非常细粒度控制事务的情况,或者在某些特定的框架或库不支持Spring的事务管理时。

PlatformTransactionManager

  1. Spring事务管理:

PlatformTransactionManager是Spring框架提供的事务管理接口,它提供了一种抽象的方式来管理事务。 Spring提供了多种实现,例如DataSourceTransactionManager(用于JDBC)、JpaTransactionManager(用于JPA)等。 你可以通过声明式事务管理(如@Transactional注解)或编程式事务管理(如TransactionTemplate)来使用PlatformTransactionManager。

  1. 依赖性: PlatformTransactionManager依赖于Spring框架,并且通常与Spring的数据访问层(如MyBatis、JPA等)一起使用。 Spring会自动管理事务的开始、提交和回滚,你只需要关注业务逻辑。

  2. 代码示例: 声明式事务管理:

java
@Service
public class YourService {

    @Autowired
    private DAO dao;

    @Transactional
    public void ceShiShiWu() throws Exception {
        PageData pd = new PageData();
        pd.put("PARAM_NAME", "testParam");
        pd.put("PARAM_VAL", "testVal");
        pd.put("PARAM_DESC", "testDesc");
        pd.put("PARAM_FLAG", "1");

        // 保存第一个对象
        dao.save("SysparamMapper.save", pd);

        // 修改参数
        pd.put("PARAM_NAME1", "testParam1");

        // 保存第二个对象
        dao.save("SysparamMapper.save", pd);
    }
}

编程式事务管理:

java
@Service
public class YourService {

    @Autowired
    private DAO dao;

    @Autowired
    private PlatformTransactionManager transactionManager;

    public void ceShiShiWu() throws Exception {
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus status = transactionManager.getTransaction(def);

        try {
            PageData pd = new PageData();
            pd.put("PARAM_NAME", "testParam");
            pd.put("PARAM_VAL", "testVal");
            pd.put("PARAM_DESC", "testDesc");
            pd.put("PARAM_FLAG", "1");

            // 保存第一个对象
            dao.save("SysparamMapper.save", pd);

            // 修改参数
            pd.put("PARAM_NAME1", "testParam1");

            // 保存第二个对象
            dao.save("SysparamMapper.save", pd);

            // 提交事务
            transactionManager.commit(status);
        } catch (Exception e) {
            // 回滚事务
            transactionManager.rollback(status);
            throw e;  // 重新抛出异常,以便上层可以处理
        }
    }
}

适用于大多数企业级应用,尤其是那些已经使用Spring框架的应用。 提供了声明式事务管理,使得代码更加简洁和易于维护。 支持多种数据访问技术(如JDBC、JPA、Hibernate等)。

适用场景总结:

TransactionContext 适合需要非常细粒度控制事务的情况,或者在某些特定的框架或库不支持Spring的事务管理时。 PlatformTransactionManager 适合大多数企业级应用,特别是那些已经使用Spring框架的应用。它提供了声明式事务管理,使得代码更加简洁和易于维护。 选择哪种方式取决于你的具体需求和项目环境。如果你的项目已经广泛使用Spring框架,那么使用PlatformTransactionManager通常是更好的选择。如果你需要更细粒度的控制或者有特定的需求,TransactionContext可能更适合你。