Spring事务相关总结

一、基本知识

定义:ACID

编程式事务 和 声明式事务

事务的隔离级别

脏读、不可重复读、幻读

ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATIONREADCOMMITTED。

ISOLATIONREADUNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。

ISOLATIONREADCOMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。

ISOLATIONREPEATABLEREAD:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。该级别可以防止脏读和不可重复读。

TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

事务的传播行为

所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为

PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

PROPAGATIONREQUIRESNEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。

PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

PROPAGATIONNOTSUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。

PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

PROPAGATIONNESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATIONREQUIRED。

事务的回滚规则

默认对RuntimeException会回滚;

可以根据需要人为控制事务在抛出某些未检查异常时任然提交事务,或者在抛出某些已检查异常时回滚事务。

事务的超时时间和只读属性

二、注意点

SPRING的事务是通过AOP实现的,而对于SPRING会对实现了AOP的BEAN进行动态代理

@transactional 加在private方法上,事务是不生效的(PROTECTED方法呢???

spring的事务是基于代理机制实现的

如果在同一个类中有两个public方法A和B,其中B加了@transactional注解,A没有,如果用A直接调用B,那么B的事务也是不生效的

这种调用方式并没有经过spring容器

最好不要将标注了@Transactional的方法用final修饰

spring对于没有实现接口的类将会用CGLIB代理,CGLIB是通过生成子类来实现代理的,而final方法不能被子类覆盖,所以对应的事务也将不会生效

事务的粒度尽量小:尽量还是让事务里面只做数据更新相关的操作

把所有的业务逻辑都放在事务里面不太好,会导致锁表时间太长,高并发的时候性能会受影响

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180209G0AED500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券