【发布时间】:2018-10-13 11:34:55
【问题描述】:
谁能解释一下这个设置如何影响innodb中的锁定行为(用一个例子)。我用不同的线程(autocommit,innodb_table_locks,LOCK TABLE ...(WRITE,READ)等)进行了许多实验。但似乎切换此选项不会以任何方式影响锁定行为。根据文档innodb_table_locks:
在 MySQL 5.6 中,innodb_table_locks = 0 对使用 LOCK TABLES ... WRITE 显式锁定的表没有影响。它确实对通过 LOCK TABLES ... WRITE 隐式(例如,通过触发器)或通过 LOCK TABLES ... READ 锁定以进行读取或写入的表产生影响。
但即使在执行 LOCK TABLES READ 时,我也没有看到将其设置为“关闭”的任何效果。
我尝试了 5.6、5.7、AWS Aurora。所有行为都相同。
更新: 这是我在 storage/innobase/handler/ha_innodb.cc 源代码中找到的:
if (thd_sql_command(thd) == SQLCOM_LOCK_TABLES
&& THDVAR(thd, table_locks)
&& thd_test_options(thd, OPTION_NOT_AUTOCOMMIT)
&& thd_in_lock_tables(thd)) {
dberr_t error = row_lock_table_for_mysql(
prebuilt, NULL, 0);
if (error != DB_SUCCESS) {
DBUG_RETURN(
convert_error_code_to_mysql(
error, 0, thd));
}
}
那么,为什么他们在文档中说设置 innodb_table_locks = 0 对显式锁定以进行写入的表没有影响?据我所知,没有这样的检查。但可能我仍然缺少一些东西。
【问题讨论】: