在如表 20-3 所示的例子中,一个 session 使用 LOCK TABLE 命令给表 film_text 加了读锁,这 个 session 可以查询锁定表中的记录,但更新或访问其他表都会提示错误;同时,另外一个 session 可以查询表中的记录,但更新就会出现锁等待。
当使用 LOCK TABLES 时,不仅需要一次锁定用到的所有表,而且,同一个表在 SQL 语句 中出现多少次,就要通过与 SQL 语句中相同的别名锁定多少次,否则也会出错!
银行转帐就是事务的一个典型例子。
应该由JAVA 代码来解决这种情况
产生并发不一致性问题主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
可以通过检查 InnoDB_row_lock 状态变量来分析系统上的行锁的争夺情况:
如果发现锁争用比较严重,如 InnoDB_row_lock_waits和 InnoDB_row_lock_time_avg 的值 比较高,还可以通过设置 InnoDB Monitors 来进一步观察发生锁冲突的表、数据行等,并分 析锁争用的原因