【问题标题】:Spring Transaction Management- Multiple request to same URLSpring 事务管理 - 对同一 URL 的多个请求
【发布时间】:2019-09-16 06:44:15
【问题描述】:
我正在尝试使用 @Transactional 注释在 Spring Boot 中创建一个关于银行资金转账的 API。
现在我想知道 - 如果同时对同一个 API 进行多次调用,如何管理它们之间的事务。例如,假设 transferBalance 方法由 Transaction X 调用,该方法将资金从帐户 A 转移到 B,另一个事务 Transaction Y 将资金从 B 转移到 C。两笔交易同时发生。这些交易将如何处理?它应该有什么样的传播,以及隔离又如何?
【问题讨论】:
标签:
spring
spring-boot
jpa
spring-transactions
【解决方案1】:
检查以下更改:针对您的情况,检查下面的粗体描述。
如果多个事务也可以使用 SERIALIZED
隔离级别定义了一个事务对某个数据存储库所做的更改如何影响其他并发并发事务,以及更改的数据如何以及何时可供其他事务使用。当我们使用 Spring 框架定义事务时,我们还可以配置在哪个隔离级别执行相同的事务。
@Transactional(isolation=Isolation.READ_COMMITTED)
public void someTransactionalMethod(Object obj) {
}
READ_UNCOMMITTED 隔离级别表明一个事务可以读取其他事务仍未提交的数据。
READ_COMMITTED 隔离级别表明事务无法读取其他事务尚未提交的数据。
REPEATABLE_READ 隔离级别规定,如果一个事务从数据库中多次读取一条记录,那么所有这些读取操作的结果必须始终相同。
SERIALIZABLE 隔离级别是所有隔离级别中限制性最强的。事务在所有级别(读取、范围和写入锁定)的锁定下执行,因此它们看起来好像是以序列化方式执行的。
【解决方案2】:
您的疑问与@Transactional 无关。
其简单的并发问题。
实际上,表单 a 到 b 和表单 b 到 c 这两个事务可以同时工作。
通过将@Transactional 声明为类似
通过应用许多回滚规则(包括正面的和负面的)来确定给定的异常是否应该导致事务回滚。如果没有规则与异常相关,它的行为类似于 DefaultTransactionAttribute(回滚运行时异常)。