0

我已阅读有关 Spring 的官方文档

@Transactional(传播。需要)

注释,但仍有一些疑问。我将向您展示一个关于我认为它的行为方式的示例:

首次服务

public class MyServiceImpl implements MyService{

@AutoWired
private OtherService otherService;

@Transactional(Propagation.REQUIRED)
 public void saveItem(Item item){.....}

@Transactional(Propagation.REQUIRED)
  public void updateItem(Item item){....}
}

@Transactional(Propagation.REQUIRED)
public void deleteItem(Item item){
   otherService.checkItem(item);
...........
 }
}

二次服务

 public class OtherServiceImpl implements OtherService  {



    @Transactional(Propagation.REQUIRED)
    public void checkItem(Item item){.....}


 }

从 Spring Controller 调用 MyServiceImpl 类:

  1. 如果我调用saveItem(),将创建一个新的物理和逻辑事务,对吗?

  2. 如果我从控制器对该服务进行两次调用,一次调用saveItem()和下一次调用updateItem(),Spring 将为每个方法创建两个物理不同的事务,对吗?

  3. 如果我调用deleteItem(),将只创建一个物理事务,因为它会在调用 deleteItem 时打开一个事务,但是从这个方法的内部调用otherService.checkItem()将重用第一个物理事务,对吗?

4

1 回答 1

0

REQUIRED 意味着运行该方法需要一个事务,因此如果一个事务在方法开始时尚未进行,则创建一个新事务(REQUIRED 是默认传播模式):

1) 没有必要,如果这是从已经有正在进行的事务的方法调用的

2)取决于控制器是否是事务性的。不应该按照惯例,只有服务层应该定义事务的范围。因此,在非事务控制器的通常情况下,您将有两个事务。

3) 取决于调用的位置是否已经在进行事务。如果是这样,那么这两种方法都将加入一个新事务,如果不是,删除项目将创建一个事务,而 otherService 继续使用它。

于 2014-02-13T17:47:25.833 回答