1.死锁情形:方法A有事务,在方法A中调用方法B,方法B开启独立事务。在B中更新A中已更新的数据,出现死锁。
@Transactional
public void functionA() {
// A方法相关逻辑
// 更新表C数据
// 调用方法B
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void functionB(){
// 方法B相关逻辑
// 更新表C数同一条数据 ----此时会出现死锁
}
2.原因分析:A事务中对表C数据的更新操作会在该条数据上加上排他锁(X锁),A方法事务未提交,并开启新事务B,B中再次进行数据库操作时无法操作上了排他锁的数据,因而出现死锁。
3.思考:在实际编码过程中,思考这种在事务A中开启新事务B的做法是否必要。很多时候是不必要的。
4.链接一个学习数据库死锁相关的文章:两个事物 update同一张表出现的死锁问题