当前位置: 首页 > 知识库问答 >
问题:

Spring@Transactional用于创建线程安全逻辑

孟栋
2023-03-14

我有一个service方法,其中我通过ID从数据库请求一个实体。如果实体具有属性payed==false,我将其设置为true并执行某些操作。如果PAID==true它只返回。

@Override
@Transactional(rollbackFor={ServiceException.class})
public void handleIntentSucceeded(PaymentIntent intent) throws ServiceException {
   LOGGER.trace("handleIntentSucceeded({})", intent);

   CreditCharge charge = transactionRepository.findByPaymentIntentId(intent.getId());

   if(charge.getPaid()) {
      return;


   // do some stuff          

   charge.setPaid(true);
   transactionRepository.save(charge);

}

现在,如果同时有多个具有相同intent的请求,则该方法将不再一致,因为例如,第一个请求使用PAID==false接收charge,因此它会做“一些事情”,如果第二个请求在第一个请求使用PAID==true保存费用之前来到该方法,则即使第一个请求已经保存了费用,它也会做“一些事情”。这是一个正确的结论吗?

为了确保一次只能有一个请求处理此方法,为了避免“某些事情”被多次执行,我可以将Transactional设置为@Transactional(isolation=isolation.serializable)。这样,只有在请求之前提交了事务时,任何请求才能处理该方法/事务。

这是最好的方法还是有更好的方法?

共有1个答案

鲜于峰
2023-03-14

如果我错了请纠正我,但这听起来像是一个应该在数据库级别上管理的锁定问题?(假设多个请求由不同的JVM处理(例如,在不同的机器上),您可能仍然只希望其中一个请求成功?)

我可能会寻找一种(乐观地)锁定记录的方法(例如,使用某种更新计数器),这样只有更改payed属性的第一个并发事务才会成功完成。
尝试同时修改同一实体的任何后续事务将失败,并且它们在do some stuff期间执行的操作将回滚。

乐观锁定与悲观锁定

 类似资料:
  • 嗯,我有三层来自控制器- 代码如下所示: 用户控制器。Java语言 用户服务。Java语言 例如,用户A和用户B同时运行相同的url,但参数不同 用户请求= 由于控制器是单例的,那么用户A的电子邮件变量是否会与用户B的电子邮件变量重叠,反之亦然? 我发现很难理解Singleton Thread-Safe在这种情况下是如何工作的。我的@Service和@Repository是否应该声明为@Scope

  • 我正在尝试使用MyBatis和一个雪花数据库。我的情况和这张海报差不多: 配置mybatis以使用现有连接 本质上,我可以获得java.sql.Connection对象,但无法通过DataSource或Oracle等RDBMS数据库通常执行的其他步骤获得该对象。一个建议的解决方案是这样做: 这些将在多线程环境中。如果有人关闭了SnowflakesSession对象,那么是否关闭了底层java.sq

  • 我可以让多个线程使用相同的HttpComponentSclientTtpRequestFactory静态实例来安全地创建它们各自的ClientTtpRequest吗? 我假设它是线程安全的,只是因为所有createRequest方法实际上执行了一个request对象的新实例化。例如, 但随后它调用了一些其他可能不是线程安全的方法。 事实上,如果你真的知道答案,哪里有手册会告诉我任何东西的线安全在S

  • 问题内容: servlet是线程安全的吗?例如,如果我打开5个不同的浏览器并向容器中的一个servlet发送请求,它是否仍然是线程安全的,我特别指的是方法 问题答案: 您的问题可以归结为: 正在从同一对象线程safe上的多个线程调用方法 。答案是: 取决于 。如果您的对象(让它成为servlet)是无状态的或仅具有字段,则这是完全线程安全的。局部变量和参数是线程局部的(驻留在堆栈上,而不是堆上)。

  • 我想知道Spring单例豆是否是线程安全的,如果是,那么为什么,如果不是,那么为什么? 因为我是初学者,所以帮助将不胜感激。

  • 问题内容: HttpUrlConnection线程安全吗?即,如果我有一个连接到服务器的HttpConnection实例,并且该实例被不同的线程使用(例如,尝试同时发送POST),HttpUrlConnection将如何处理这种情况?a)他们将串行发送POST,还是b)第一个线程发送POST,获取响应,然后第二个线程发送POST?如果它们以串行方式发送POST,则意味着到同一tcp连接的多个活动P