教你详细使用Spring框架中编程式事务
@Resourceprivate DataSourceTransactionManager transactionManager;public AjaxResult saveTracksAndSignExpressOrder() {TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());try {// 业务代码transactionManager.commit(transactionStatus);} catch (Exception e) {transactionManager.rollback(transactionStatus);log.error(exceptionMessage, e);return AjaxResult.error(exceptionMessage + e.getMessage());}return AjaxResult.success();}
这段代码是一个使用 DataSourceTransactionManager
进行编程式事务管理的示例,其中包含了一个名为 saveTracksAndSignExpressOrder
的方法,该方法用于保存跟踪信息并签署快递订单。以下是代码的详细解析:
注入事务管理器
@Resource
private DataSourceTransactionManager transactionManager;
@Resource
是Spring提供的注解,用于依赖注入。这里它被用来自动注入DataSourceTransactionManager
的实例到transactionManager
变量中。
开始事务
TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
- 通过
transactionManager
获取一个新的TransactionStatus
对象,表示一个新的事务开始。DefaultTransactionDefinition
是TransactionDefinition
的一个实现,它定义了事务的默认属性。
业务代码执行
try {// 业务代码
}
- 在
try
块中,放置实际的业务逻辑代码。这些代码可能会包含数据库操作,如插入、更新或删除数据等。
提交事务
transactionManager.commit(transactionStatus);
- 如果业务代码执行成功,没有抛出异常,那么调用
commit
方法提交事务,这会使得所有在事务中进行的数据库操作被永久保存。
异常处理和事务回滚
catch (Exception e) {transactionManager.rollback(transactionStatus);log.error(exceptionMessage, e);return AjaxResult.error(exceptionMessage + e.getMessage());
}
- 如果在业务代码执行过程中抛出异常,那么会进入
catch
块。 transactionManager.rollback(transactionStatus);
回滚事务,撤销所有在事务中进行的数据库操作。log.error(exceptionMessage, e);
记录异常信息到日志中。这里exceptionMessage
应该是一个定义好的字符串变量,表示异常的描述。return AjaxResult.error(exceptionMessage + e.getMessage());
返回一个错误响应给调用者,其中包含了异常信息。
成功响应
return AjaxResult.success();
- 如果事务成功提交,没有异常发生,那么返回一个成功的响应。
总结
这个方法通过编程式事务管理确保了数据库操作的原子性。如果在执行业务逻辑时出现异常,事务会回滚,确保数据库状态保持一致。这是处理需要多个数据库操作组合在一起作为一个单一工作单元的常见模式。