通过这篇文章,你将学习到Spring框架中中事务的传递 1. 简介 在处理Spring管理的事务时,开发人员可以以传播的方式定义事务的行为。换句话说,开发人员能够决定业务方法如何被封装在逻辑和物理事务中。来自不同Spring bean的不同方法可以在相同的事务范围或分割为多个嵌套的事务中执行。这可能导致像内部事务产生的结果如何影响外部事务的细节。我们将在下一节中看到Spring中不同的传播机制的不同行为。 |
本教程将仅关注事务的传播机制行为。Spring事务的其他方面的细节,你可以参考其他的教程或Spring官方文档。 本教程所使用的完整代码可以在教程的下方下载。我们将仅显示Spring中帮助大家了解事务传播机制相关部分。 完整的源代码使用Hibernate实现持久层(Spring使用Hibernate的事务示例)。 |
注意内部bean的方法使用了REQUIRED进行了注解并抛出了RuntimeException。这意味着它将于外部bean使用相同的事务,因此外部事务在提交时将失败并同样进行回滚操作。 注意:默认情况下,只有非受检异常(unchecked exception),像RuntimeException,会将事务的状态设置为回滚。如果你希望受检异常(checked exception)也可以将事务状态设置为回滚,你必须设置它们,但此内部不包含在本教程中。 注意2:当使用声明式事务时(也就是通过使用注解形式),如果在相同的bean中直接调用方法(自己调用自己的方法),@Transactional注解将被容器忽略。如果你希望启用自身方法调用的事务管理,你必须使用aspectj来配置事务,但是该内容不包含在本教程中。 |
3. REQUIRES_NEW行为REQUIRES_NEW行为意味着容器将总会创建新的物理的事务。换句话说,内部的事务可以独立于外部事务而提交或回滚事务,也就是说外部的事务将不受内部事务的结果影响:它们将返回不同的物理事务。.
外部 bean
内部 bean
|
7. NOT_SUPPORTED行为NOT_SUPPORTED行为标示在执行方法时,将忽略事务。如果已存在打开的事务,则该事务会被挂起。 8. SUPPORTS行为SUPPORTS行为标示在执行方法时,如果存在事务,则在事务范围执行,如果不存在,则不以事务方式执行。 9. 完整的笔记源码本页尾有完整的代码下载。下面是 MySQL 建表语句:
MySQL 建表语句
下载本教程源码 |