2

不确定“范围”是否是正确的术语。

我正在使用 Spring 进行 JPA 事务管理(下面有一个 Hibernate)。我执行数据库事务的方法是私有的,但是因为您只能在类或公共方法上设置 @Transactional

由于这种机制是基于代理的,只有通过代理传入的“外部”方法调用才会被拦截。这意味着“自调用”,即目标对象中的一个方法调用目标对象的其他方法,即使调用的方法标有@Transactional,也不会在运行时导致实际事务!

我已将类的公共入口点设置为@Transactional。

@Transactional
public void run(parameters) {
    //First non-database method, takes a decent amount of time
    Data data = getData();
    //Call to database
    storeData(data);
}

private storeData(data) {
    em.persist(data);
}

这是不好的做法吗?Spring 是否保持开放事务的时间比这里需要的时间更长?我正在考虑将 storeData() 方法移至 DAO 类并将其公开,但作为学术观点,我想知道重构为 public 是否会对性能产生任何好处。

4

3 回答 3

1

如果数据库上存在大量争用,那么保持事务尽可能小绝对是至关重要的——比公共与私有区别重要得多,后者本身不会影响性能和可伸缩性。所以,要实际...!

于 2009-04-30T15:23:14.957 回答
1

在您的代码执行与事务上下文交互的操作之前,事务范围无效,在本例中为 storeData() 方法。getData() 是非事务性的这一事实不应影响代码的并发性能,因为任何数据库锁定只会在达到 storeData() 时发生。

于 2009-04-30T15:23:46.563 回答
0

正如每个人都指出的那样,我们应该使事务尽可能小,以便连接仍然可用于其他请求。可以这样重构吗

public void run(parameters) {
  Data data = getData();
  storeData(data);                                                             
 }

@Transactional
public storeDate(data){em.persist(data)}
于 2018-09-10T10:34:12.897 回答