CannotAcquireLockException 锁超时
表锁和行锁
表锁:在添加数据时把整个表锁住
行锁:在添加数据时只锁添加数据的一行
增加索引把表锁改变为行锁
栏位:username 索引类型: UNIQUE
//main
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
AccountService accountService = ctx.getBean(AccountService.class);
accountService.update3();
}
//update3
public void update3() {
jdbcTemplate.update("update tase set money = ? where username=?;", 00, "aa");
accountService2.update4();
int i = 1 / 0;
}
//update3
public void update4() {
jdbcTemplate.update("update tase set money = ? where username=?;", 00, "bb");
}
//xml
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--以add开始的方法添加事务-->
<tx:method name="add*"/>
<tx:method name="insert*"/>
<tx:method name="delete*"/>
<tx:method name="update3" propagation="REQUIRED"/><!--REQUIRED为默认的-->
<tx:method name="update4" propagation="REQUIRES_NEW"/>
</tx:attributes>
</tx:advice>

本文探讨了Java中`update3`和`update4`方法引发的CannotAcquireLockException,重点讲解了表锁与行锁的区别,以及如何通过增加UNIQUE索引来优化。通过`update3`使用REQUIRED事务传播行为与`update4`的REQUIRES_NEW策略,展示了事务隔离级别对锁的影响。
2万+

被折叠的 条评论
为什么被折叠?



