spring-boot - @Transactional 隔离级别似乎不起作用
问题描述
我对@Transactional(又名 spring-tx)有一些疑问。
在这样的代码中。
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
public TestObject testTransaction(Long id, String name, String content) {
//This is find
TestObject testObject = testObjectRepository.findById(id).orElse(null);
if (testObject != null) {
System.out.println(testObject.getId() + "/"
+ testObject.getName() + "/"
+ testObject.getContent());
}
// update something
testObject.changeContent(name, content);
slowQuery();
//delay for late
return testObject;
}
如果我使用邮递员请求这样的东西。
第一个请求是http://localhost:8080/spring/test/transaction?id=1&name=123&content=123
第二个请求是http://localhost:8080/spring/test/transaction?id=1&name=456&content=456
然后我猜,第一个请求挂在事务上,那么第二个请求必须被 Spring-tx 拒绝,因为第一个请求事务的隔离级别是SERIALIZABLE
,并且事务工作没有完成。
但是两个请求的结果是
{
"name":"456",
"content":"456"
}
有谁知道我使用 mysql 和 docker 以及 spring-data-jpa 的事务隔离。
解决方案
如果您使用 @Transactional 注释,那么为了确保在 db 中发生提交,请使用另外一个注释,因为 @EnableTransactionManagement 还包括以下代码
connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
有关相同的更多详细信息,请点击此链接
推荐阅读
- r - download.file 下载的 xlsx 文件无法打开
- excel - 从 Excel 单元格中提取固定长度的数字
- ios - 删除 tableview 中的最后一个条目使应用程序崩溃,更新无效:第 0 节中的行数无效
- node.js - 将url参数传递给mongodb中的$match查询
- bash - 仅使用linux命令进行日志分析时如何找到最多的时间成本线?
- swift - Alamofire 无法将标头转换为 HTTPHeaders 以传递多部分 PUT 请求
- mysql - 保护 Heroku 的 REST API
- java - java.sql.SQLException:调用中的参数无效:getBytes()
- typescript - 将数组转换为具有来自数组元素中的公共属性的键的对象
- jmeter - 运行 JMETER 脚本时无法解析/获取 JWT 令牌