事务是确保逻辑处理原子性的重要手段,通过事务控制,可以有效避免因逻辑处理失败而导致的脏数据等问题。
@Transactional 是声明式事务的注解,可以应用于类、接口或方法。
事务传播级别决定了事务的控制范围。
PROPAGATION_REQUIRED(默认):如果上下文中已存在事务,则加入到事务中执行;如果不存在,则新建事务执行。
若B方法抛出异常,A方法进行捕获,A会抛出异常,因为C2标志回滚,C1标志提交,产生冲突。
若B方法抛出异常,B方法内部捕获,A、B都不会回滚。
若A或B抛出异常,但没有捕获,则A、B都回滚。
A、B可操作同一行记录,因为处在同一事务中。
PROPAGATION_MANDATORY:要求上下文中必须存在事务,否则会抛出异常。
能有效控制上下文调用代码遗漏添加事务控制。
例如一段代码不能单独被调用执行,但一旦被调用,就必须有事务包含的情况,就可以使用这个传播级别。
PROPAGATION_REQUIRES_NEW:每次都会新建一个事务,并挂起上下文中的事务,执行完当前新建事务后,上下文事务恢复再执行。
若B方法抛出异常,A方法进行捕获,B方法回滚,A方法不受B异常影响。
若B方法抛出异常,B方法进行捕获,A、B都不会回滚。
若A方法抛出异常,不会影响B正常执行。
若B方法抛出异常,A、B方法都没有处理,则A、B都会回滚。
A、B不可操作同一条记录,因为处于不同事务中,会产生死锁。
PROPAGATION_SUPPORTS:如果上下文存在事务,则支持事务加入;如果没有事务,则使用非事务的方式执行。
通常用于处理非原子性的非核心业务逻辑操作,应用场景较少。
PROPAGATION_NOT_SUPPORTED:若当前上下文中存在事务,则挂起事务,执行当前逻辑,结束后恢复上下文的事务。
可以将事务范围尽可能地缩小,建议优先使用代码隔离的方式进行。
一个事务越大,其存在的风险也就越多。
PROPAGATION_NEVER:要求上下文中不能存在事务,一旦有事务,就抛出runtime异常。
PROPAGATION_NESTED:如果当前存在事务,则嵌套(savepoint)在当前事务中执行。如果当前没有事务,则新建一个事务,类似REQUIRE_NEW。
温馨提示:答案为网友推荐,仅供参考