MySQL 事务管理与内置函数使用指南
1. 锁超时问题
在数据库操作中,死锁是锁定带来的最严重后果。但在很多情况下,一个会话中的程序可能无法读写特定行,因为该行被另一个会话锁定。此时,程序默认会等待一段时间,直到锁被释放,之后要么获取锁,要么超时。
可以通过设置 innodb_lock_wait_timeout 配置值来指定会话等待 InnoDB 锁释放的时间,默认值为 50 秒。当超时发生时,MySQL/InnoDB 会回滚事务并发出错误代码 1205,示例如下:
mysql> SELECT * FROM account_balance FOR UPDATE;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
如果有长时间运行的事务,可增加 innodb_lock_wait_timeout 的值,或引入错误处理代码来应对偶尔出现的 1205 错误。
在某些情况下,特别是在同一事务中混合使用 MySQL/InnoDB 和非 InnoDB 表时,MySQL/InnoDB 可能无法检测到死锁,最终会出现“锁等待超时”错误。若有此情况且担心死锁,可实现类似处理死锁的锁超时错误处理逻辑。
2. 乐观与悲观锁定策略
2.1 问题引入
当事务读取的数据随后会参与 UPDATE、INSERT 或 DELETE 操作时,需确保在读取数据到更新数据期间,
超级会员免费看
订阅专栏 解锁全文
761

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



