
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
事务的学习与应用是大多数软件编程开发程序员都需要熟练掌握的一个编程技术,而本文我们就通过案例分析来简单了解一下,Spring声明式事务基础知识分享。
声明式事务实现原理就是通过AOP/动态代理。
在Bean初始化阶段创建代理对象:Spring容器在初始化每个单例bean的时候,会遍历容器中的所有BeanPostProcessor实现类,并执行其
postProcessAfterInitialization方法,在执行AbstractAutoProxyCreator类的postProcessAfterInitialization方法时会遍历容器中所有的切面,查找与当前实例化bean匹配的切面,这里会获取事务属性切面,查找@Transactional注解及其属性值,然后根据得到的切面创建一个代理对象,默认是使用JDK动态代理创建代理,如果目标类是接口,则使用JDK动态代理,否则使用Cglib。
事务拦截器TransactionInterceptor在invoke方法中,通过调用父类TransactionAspectSupport的invokeWithinTransaction方法进行事务处理,包括开启事务、事务提交、异常回滚。
事务配置一、事务隔离级别
配置该事务的隔离级别,一般情况数据库或应用统一设置,不需要单独设值。
事务配置二、事务传播属性
事务传播属性是spring事务模块的一个重要属性。简单理解,他控制一个方法在进入事务时,在外层方法有无事务的场景下,自己的事务的处理策略,如是复用已有事务还是创建新事务。
事务配置三、事务超时
事务的超时设置是为了解决什么问题呢?
在数据库中,如果一个事务长时间执行,这样的事务会占用不必要的数据库资源,还可能会锁定数据库的部分资源,这样在生产环境是非常危险的。这时就可以声明一个事务在特定秒数后自动回滚,不必等它自己结束。
事务超时时间的设置
由于超时时间在一个事务开启的时候创建的,因此,只有对于那些具有启动一个新事务的传播行为(PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、ROPAGATION_NESTED),声明事务超时才有意义。
事务配置四、事务只读
如果一个事务只对数据库进行读操作,数据库可以利用事务的只读特性来进行一些特定的优化。我们可以通过将事务声明为只读,让数据库对我们的事务操作进行优化。
事务配置五、回滚规则
回滚规则,就是程序发生了什么会造成回滚,这里我们可以进行设置RuntimeException或者Error。
默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚。
我们可以声明事务在遇到特定的异常进行回滚。同样,我们也可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。
声明式事务失效的场景
事务同步管理器
Spring中有一个事务同步管理器类
TransactionSynchronizationManager,它提供了事务提交后处理等相关回调注册的方法。当我们有业务需要在事务提交过后进行某一项或者某一系列的业务操作时候我们就可以使用
TransactionSynchronizationManager。
事务实践相关
数据一致性
同一个数据源的操作在一个事务内可保证一致,但实际场景中会因为不同事务或不同数据源(不同关系数据库、缓存或远端服务)而导致数据不能强一致。在CAP理论框架下,我们一般是保证可用性、分区容错性,基于BASE理论达到终一致性。但如何达到数据的终一致性需要合理设计。
数据库的提交、缓存的更新、RPC的执行、消息的发送的先后顺序
一般我们以数据库数据为准,先数据库提交,再更新缓存或发送消息,通过异步轮询补偿的方式保证异常情况下的终一致性。
不建议用法:
1、事务回滚会导致缓存和数据库不一致
2、事务回滚会导致消息接收方收到的数据状态错误
建议用法:
1、先更新数据库,事务提交后再更新缓存或发送消息
2、通过异步异常重试或批处理同步来保证数据的终一致性
3、核心交易以数据库数据为准
系统健壮性增强,但编程模型复杂一些
长事务
如果事务中有耗时长的SQL或有RPC操作可能会导致事务时间变长,会导致并发量大的情况下数据库连接池被占满,应用无法获取连接资源,在主从架构中会导致主从延时变大。
建议事务粒度尽量小,事务中尽量少包含RPC操作。事务尽量放在下层。
不建议用法
建议用法
这种方式需要应用程序保证多个事务操作的终一致性,一般可通过异常重试来实现。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。