Spring事务边界和DB连接保持

ami*_*que 12 java spring hibernate jpa transactions

我正在使用spring boot并使用tomcat连接池在jpa上休眠.能帮我理解spring在事务处理中如何使用数据库连接.例如,考虑以下场景:

  1. 我们有2个连接的数据库连接池.
  2. Spring启动一个事务,即用@Transactional注释修饰的调用方法.
  3. 此方法执行数据库更新
  4. 调用外部服务
  5. 当从外部服务收到响应时,它会更新DB并返回.
  6. Spring提交交易

假设外部服务(步骤4)需要1分钟才能完成,数据库池中将有多少个DB连接可用?假设spring保持DB连接,直到事务完成,在此期间收到的任何请求只有1个DB连接可用,如果我们收到多个请求,则必须等待DB连接.

请确认我的理解,如果它是正确的,请建议我如何在高交易量系统中处理这种情况.

谢谢

Ren*_*ink 10

首先你的理解是正确的.请参阅有关声明式事务管理的spring文档.

在此输入图像描述

我猜您在事务中执行外部服务调用,因为您希望在发生异常时回滚数据库更改.或者换句话说,您希望db更新反映外部服务调用的状态.

如果是这样,您无法将其移出事务边界.在这种情况下,您应该增加连接池大小,或者可以将长时间运行的事务委派给处理它们的专用服务器节点.这将保持例如"主"服务器节点,该节点处理远离长时间运行的事务的用户请求.

你应该考虑数据的一致性.是否必须将db更新与外部服务调用同步?外部服务调用是否可以移出事务边界?