Springboot+JDBCTemplete+MySQL InnoDB+druid连接池事务出问题 2C

方法如下:
tb_counter中只有一行记录,用作计数器变量,每次执行gogo会将其加100
然后将其值插入tb_block
可重复读情况下,单个访问没问题,但并发访问总是抛异常说:插入tb_block时主键值重复
System.out输出的num也重复了
理论上num应该在事务中锁定,每次增加100,应该不可能有重复的才对啊
log中事务也显示正常开启和完成
但把druid连接数设置为1时,就不会出现这个问题
把事务隔离级别设置为最高时也不会出现,但是会老抛异常说死锁
mysql重启了,也一样,数据库清了也一样。。。。。
生无可恋。。。。

 @Autowired
JdbcTemplate jdbct;

@Transactional(propagation=Propagation.REQUIRED)
public String gogo()
{

Long num=jdbct.queryForObject("SELECT num FROM tb_counter WHERE id = 0",Long.class);
System.out.println(num);
jdbct.update("INSERT INTO tb_block(id,state) VALUE("+num+",'DNF')");
jdbct.update("UPDATE tb_counter SET num="+(num+100)+" WHERE id = 0");
return num.toString();
}

}

3个回答

主键重复的问题是数据库的问题啊

Spring 事物默认的隔离级别是当前数据库的隔离级别,要么你在Spring中设置当前事物的隔离级别,要么你在数据库中配置数据库的隔离级别,防止脏读脏写的出现

感谢各位的回答,但我最后研究出的结果是,mysql使用mvcc所以本身的可重复读级别无法自动避免第二类丢失更新,在这里跟大家分享一下这个坑,免得大家踩了坑****

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问