近两天网站经常出现死锁的情况,程序执行非常简单的insert或update语句,使用了spring自带的事务,没有关联其它表。
用show processlist;查看
显示的状态有的是Update有的是Updating,把这个连接全部kill掉也不能恢复正常,一定要重启mysql,不知道有没有前辈遇到过这种情况?
用show processlist;查看
显示的状态有的是Update有的是Updating,把这个连接全部kill掉也不能恢复正常,一定要重启mysql,不知道有没有前辈遇到过这种情况?
update语句也是非常简单的update tables set b=2,c=3 where id=1insert和update的表有外键。搞不明白,为什么会锁死表呢。
update的where条件只有一个,是主键id
但是当一个用户对表进行操作,操作之前事务会把表锁住,然后事务没有及时提交(解锁),就对表进行读取,造成了自己(的读取)对自己(提交写等操作的缓冲)进行等待,造成死锁。
这个问题以前遇到过。
因为spring 对数据库操作封装了,不要观察怎么执行,不过你可以测试一下回调Hibernate用原生态的语句执行观察一下。
我没用hibernate,因为应用不适合使用hibernate。不过你说的这句话,有可能发生,意思是不是当一个事务在update或insert时如果事务还未提交的情况下另一个事务对表进行select就会造成死锁呢?
我的日志文件怎么只有一个localhost.localdomain.err呢,里面看不到什么东西。
log_slow_queries把这个选项打开测试一下,不需要时 关闭。
不过个人还是认为关键不在数据库端,而在你应用端的配置或者操作,不怎么喜欢spring的封装。
是不是一定要在程序内操作事务才会使用mysql的事务?如果程序内不操作事务,mysql会不会默认启用事务?
我用的spring注解配置的事务啊,readonly的不使用事务啊!!我全部select的也用了事务,用的是SUPPORTS,是不是这个原因会造成死锁的!
read-only是要设为true,我是在开发过程中所以设为false。--------------------------------------------
啊,readonly的不使用事务啊!!我全部select的也用了事务,用的是SUPPORTS,是不是这个原因会造成死锁的
--------------------------------------------
你这样设置肯定是有问题的。
哎,这下学到了一个大东西。。没加入过什么大型项目的开发,对这些都不是很了解。意思是real-only如果为true的话,一般情况下是不用使用事务的,除非特殊情况对吗?