举例讲解spring事务传播行为
发布网友
发布时间:2024-10-07 06:32
我来回答
共1个回答
热心网友
时间:2024-11-24 15:38
在编程中,如何在两个方法间共享事务行为,特别是在方法调用时,这是一个常见的问题。假设我们有两个方法A和B,A方法调用了B方法,如果A和B都添加了事务注解,那么会使用哪个事务?这就是Spring事务传播行为要解决的问题。
在Spring中,有七种事务传播行为。这七种方式各有特点,通常理解即可。我们只关注其中的两种常用方式。
第一种是“REQUIRED”。如果方法B被标记为REQUIRED,而方法A调用了方法B,那么如果方法A当前没有事务,B将创建一个新的事务;如果方法A已经存在一个事务中,B将加入这个事务。这是最常见且默认的选择。
举个例子:假设我们要进行转账操作。数据库层负责数据读写,业务逻辑层处理具体的业务逻辑,包括事务管理。测试层用于验证功能的正确性。
当方法A(testDo)不加事务注解,而方法B(transfer)被标记为REQUIRED时,方法B会创建新事务独立执行。如果转账成功,张三账户增加1000,李四账户增加4000。若执行方法B时发生异常,事务回滚,转账失败,两账户金额恢复原状。方法A和B分别在各自的事务中独立执行。
若在方法A上也加了事务注解,当调用方法B(transfer)时,B方法和A方法中的事务合并到同一个事务中。如果执行中发生异常,事务回滚,转账操作失败,两账户金额保持在调用前状态,即张三账户变为2000,李四账户变为3000。
第二种方式是“REQUIRES_NEW”。如果方法B被标记为REQUIRES_NEW,那么无论方法A是否处于事务中,方法B都会创建一个新的事务执行。这保证了方法B的执行是独立的,不受方法A事务的影响。
在测试中,无论方法testDo是否有事务,调用方法B(transfer)都会创建新的事务执行。转账1000成功,转账2000失败。最终结果是张三账户1000,李四账户4000,两个方法分别在各自事务中独立执行。