gpt4 book ai didi

java - 使用 Spring Data 和 MySQL 运行 2 个事务方法时出现死锁

转载 作者:行者123 更新时间:2023-11-29 02:17:47 30 4
gpt4 key购买 nike

我尝试使用 Spring Boot、Spring Data 和 MySQL 来理解事务。

我创建了服务 UpdateService 用于更新数据库中的记录。方法 changechange2 以事务方式执行。

@Autowired
private UserRepo userRepo;

@Transactional(isolation = Isolation.SERIALIZABLE)
public void change() {
User user = userRepo.findOne("Jan");

write("before change", user);
sleep(2000);
user.setPassword("new password");
write("after change", user);
}

@Transactional(isolation = Isolation.SERIALIZABLE)
public void change2() {
User user = userRepo.findOne("Jan");

write("before change2", user);
user.setSecondName("new name");
write("after change2", user);
}

当我调用 changechange2 方法时,我收到了这些日志:

before change User(name=Jan, secondName=Adam, password=Kowalski)
before change2 User(name=Jan, secondName=Adam, password=Kowalski)
after change2 User(name=Jan, secondName=new name, password=Kowalski)
after change User(name=Jan, secondName=Adam, password=new password)

...在那之后我也得到了这个异常(exception):

com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

我的问题是:为什么 change2 的事务在 change 完成之前开始?死锁的原因是什么?

最佳答案

下面是我的观点:

why transaction change2 starts before change is done?

对于mysql,首先要关心MySQL的版本,看this official site url about transaction .特别是隔离级别SERIALIZABLE的描述:

  • 这个级别类似于 REPEATABLE READ,但是如果禁用自动提交,InnoDB 会将所有普通的 SELECT 语句隐式转换为 SELECT ... LOCK IN SHARE MODE。如果启用自动提交(也就是说,change读操作不会阻塞change2的读操作 ),SELECT 是它自己的事务。因此已知它是只读的,如果作为一致(非锁定)读取执行并且不需要为其他事务阻塞,则可以序列化。 (如果其他事务修改了所选行,要强制普通 SELECT 阻塞,请禁用自动提交。

What is the reason of deadlock?

当执行changechange2的读操作时,表示两个事务持有同一行的共享锁。当执行change(transaction t1)和change2(transaction t2)的写操作时,t1会等待t2释放Shared Lock,t2也会将等待 t1 释放共享锁,因此这将导致死锁。

建议你看看MySQL的事务和锁机制:

http://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-model.html http://dev.mysql.com/doc/refman/5.7/en/innodb-lock-modes.html

希望能帮到你。

关于java - 使用 Spring Data 和 MySQL 运行 2 个事务方法时出现死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36857890/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com