一、Java事务导引
二、Spring事务核心接口
三、Spring事务属性定义
而TransactionDefinition接口内容如下:
public interface TransactionDefinition {
int getPropagationBehavior(); // 返回事务的传播行为
int getIsolationLevel(); // 返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据
int getTimeout(); // 返回事务必须在多少秒内完成
boolean isReadOnly(); // 事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的
}
我们可以发现TransactionDefinition正好用来定义事务属性,下面详细介绍一下各个事务属性。
(1)传播行为(传送门 Spring - 事务之传播行为):
(2)隔离级别(传送门 Spring - 事务之隔离级别):
四、Spring事务状态
五、代码
- 编程式 Spring - 事务之编程式
- 声明式 Spring - 事务之声明式
- 总结
六、Spring 事务原理机制(传送门 Spring - 事务之原理机制)
七、Spring事务 & 数据库事务联系
本质上其实是同一个概念,spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的。数据库的事务说简单就只有开启,回滚和关闭,spring对数据库事务的包装,原理就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作。但是spring除了实现这些,还配合spring的传播行为对事务进行了更广泛的管理。其实这里还有个重要的点,那就是事务中涉及的隔离级别,以及spring如何对数据库的隔离级别进行封装。事务与隔离级别放在一起理解会更好些。
附:注意事项
- 事实上Spring并不直接管理事务,而是提供了多种事务管理器。他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。
- 一般事务隔离级别设置TRANSACTION_READ_COMMITTED就差不多了,剩下的通过使用数据库的锁来帮我们处理别的。
- 为什么将事务作用在biz层呢,为什么不可以是在dao层,或者controller层?
因为对于dao层,太细粒度了;而对于controller层又太粗糙了(耦合度太大)。 - tx: method,顺序有关,写在前头的优先级较高。【?】
- 使用注解控制事务方法的优点:
1:开发团队达成一致约定,明确标注事务方法的编程风格。
2:保证事务方法的执行时间尽可能短,不要穿插其他网络操作RPC / HTTP请求或者剥离到事务方法外部。
3:不是所有的方法都需要事务,如只有一条修改操作,只读操作不需要事务控制。 - 待更新...