数据库死锁和破解方法
死锁产生原因
事务A开启事务后,更新t_student表ID为10的数据,没有提交也没有回滚。
事务B开启事务也更新t_student表ID为10的数据,这个时候因为t_student表ID为10的数据被事务A锁住了,这个锁没有释放。故产生死锁。
解决方法
1. 事务中操作的时间
2. 事务及时提交或回滚
此外,不要轻易对线上数据库进行 DDL 操作,尤其是使用量大且频繁的数据表,强行修改可能会引发灾难性后果,目前修改线上表结构主要有以下几种方式:
- 等到使用量小的时候(例如半夜)修改,但有一定风险。
- 暂时停止服务,修改完毕再上线,但会影响用户体验。
- 复制旧表结构到新表,旧表创建触发器,旧表操作同步执行到新表,然后对新表修改表结构,同步旧数据到新表,锁旧表(只读),最后新表替换旧表,此方案基本对用户体验无影响,但操作较为复杂。
- 新建扩展表,但如果字段使用频繁会影响性能。
在实际生产中,我们需要根据具体场景去选择适合自己的表结构变更方式。