java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring配置Transaction与不配置的区别

Spring中配置Transaction与不配置的区别及说明

作者:qq_32331073

这篇文章主要介绍了Spring中配置Transaction与不配置的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Spring配置Transaction与不配置有何区别

首先

Spring中 Transaction管理 配置有两种方式:

Note: 以下所有讨论,都是用 @Transactional 方式来 开启Transaction支持

问题

解决

1.配置@Transactional的目的就是手动开启事务,保证method中一系列sql操作包含在同一事务中,从保证数据的完整性(回滚或提交)与读写安全(隔离级别);

2.DataSource缺省 配置: defaultAutoCommit=true;

即: 如果method不配置 @Transactional ,则每执行一个 SQL操作,如果成功,默认开启的事务就会 立即 向数据库自动commit,而不能rollback

3.为了维护 数据库的完整性,保证成批的 SQL 语句要么全部 commit,要么全部 rollback。通常包含以下两种方式:

method上配置注解@Transactional,就是使用第一种方式来实现Transaction管理 (基于SpringAOP实现方法增强,这里表现为TransactionAspectSupport ) 。

@Transaction注解使用解释

概念

@Transactional注解是Spring框架提供的一个用于声明式事务管理的注解,方便我们管理事务,保证数据的一致性与可靠性。

事务4个基本特性:

原子性:一个事务要不全部(sql)执行;要不都不执行(回滚)。

一致性:事务执行前后数据库的状态保存一致。(数据完整性,约束,预期一致)

隔离性:多个事务并发执行时,事务的执行时互不干扰的。

持久性:事务一旦提交,所做的操作,永久保存在数据库中。

使用

可以放在方法上,可以放在类上。

属性

propagation传播行为、isolation隔离级别、timeout超时时间、readOnly是否为只读事务、rollbackFor指定回滚异常类型、noRollbackFor抛出指定异常类型,不混滚事务。

propagation传播行为

REQUIRED (默认)

SUPPORTS

MANDATORY

REQUIRES_NEW

NOT_SUPPORTED

NEVER

NESTED

注意:NESTEDREQUIRES_NEW 之间的主要区别在于,NESTED 的事务是依赖于外部事务的,而 REQUIRES_NEW 则会完全独立地开始一个新的事务。

在使用 @Transactional 注解时,要特别注意方法的调用方式。

例如,一个标记为 @Transactional 的方法被同一个类中的另一个方法直接调用时,事务的边界可能不会按照预期工作,因为Spring AOP默认是基于接口的代理。

如果你直接调用同一个类中的方法,那么代理不会生效,因此事务管理也就不会工作。

在这种情况下,你可能需要将该方法移动到另一个类中,或者使用编程式事务管理来手动控制事务。

isolation隔离级别

失效场景

方法不是public的:

当前类没有被Spring容器托管:

异常被捕获:

数据库不支持事务:

使用了错误的事务传播机制:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文