TransactionContext和PlatformTransactionManager是两种不同的事务管理方式,它们在实现和使用上有一些关键的区别。这两种方法的区别:
TransactionContext
- 自定义事务管理:
TransactionContext是你自定义的事务管理类,它直接操作JDBC连接来控制事务。 你手动调用beginTransaction()、commit()和rollback()方法来控制事务的开始、提交和回滚。 这种方式更接近于底层的JDBC操作,提供了更细粒度的控制。
- 依赖性:
TransactionContext依赖于你的数据库连接池(如DBConnectionManager)来获取和释放连接。 你需要自己处理连接的获取、释放和异常情况下的回滚。
- 代码示例:
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来管理事务。这种方式需要你在业务逻辑中显式地管理事务的生命周期。
- 适用场景:
适用于需要非常细粒度控制事务的情况,或者在某些特定的框架或库不支持Spring的事务管理时。
PlatformTransactionManager
- Spring事务管理:
PlatformTransactionManager是Spring框架提供的事务管理接口,它提供了一种抽象的方式来管理事务。 Spring提供了多种实现,例如DataSourceTransactionManager(用于JDBC)、JpaTransactionManager(用于JPA)等。 你可以通过声明式事务管理(如@Transactional注解)或编程式事务管理(如TransactionTemplate)来使用PlatformTransactionManager。
依赖性: PlatformTransactionManager依赖于Spring框架,并且通常与Spring的数据访问层(如MyBatis、JPA等)一起使用。 Spring会自动管理事务的开始、提交和回滚,你只需要关注业务逻辑。
代码示例: 声明式事务管理:
@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);
}
}编程式事务管理:
@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可能更适合你。