在超类上使用事务有什么缺点吗?

问题描述 投票:0回答:1

示例案例是:

超级级:

abstract class MySuper {
   @Transactional
   public void handle() {
   }
}

子类:

class MySub extends MySuper {

   public void handle() {
      //implement
   }
}

我想在方法级别添加

Transactional
作为默认行为。
handle()
方法可能是事务性或非事务性或任何与数据库相关的操作。在这种情况下,使用
Transactional
有什么缺点吗?

我假设我可以在方法级别重写

Transactional
,因此当我需要只读、传播、回滚选项时,我可以轻松处理它。

spring-boot transactions
1个回答
0
投票

让我们一一考虑一些情况:

第一种情况: 使用事务性无数据库操作:

@Transactional
public void normalSave() {
    Test test = new Test();
    test.setName(UUID.randomUUID().toString());
    ... some computations.
    Thread.sleep(30000);
}

在这种情况下,将在数据库上打开新的冗余连接,并等待 30 秒。

第二种情况: 使用事务性 with-db 操作:

@Transactional
public void normalSave() {
    Test test = new Test();
    test.setName(UUID.randomUUID().toString());
    testRepository.save(test);
    Thread.sleep(30000);
}

在这种情况下,新连接将在数据库上打开,并且将等待 30 秒才能提交,但我们在数据库端只有 save 方法,很可能它将在毫秒内处理。太多余了。

注意:您可以将

Thread.sleep
操作视为一些第三方调用操作。

还有其他一些陷阱:https://codete.com/blog/5-common-spring-transactional-pitfalls

© www.soinside.com 2019 - 2024. All rights reserved.