mysql LOCK TABLES语句的超时时间是多少?
我无法在任何地方找到答案。
我尝试在my.cnf中设置变量innodb_lock_wait_timeout,但似乎它与另一种(行级)锁定有关,而不是表锁定。
简单来说,它对LOCK TABLES没有影响。
我想为死锁情况设置一些较低的超时值,因为如果某些操作将锁定表并且出现问题,它将挂起整个网站!
例如,在您的网站上完成购买就很愚蠢。
mysql LOCK TABLES语句的超时时间是多少?
我无法在任何地方找到答案。
我尝试在my.cnf中设置变量innodb_lock_wait_timeout,但似乎它与另一种(行级)锁定有关,而不是表锁定。
简单来说,它对LOCK TABLES没有影响。
我想为死锁情况设置一些较低的超时值,因为如果某些操作将锁定表并且出现问题,它将挂起整个网站!
例如,在您的网站上完成购买就很愚蠢。
我的解决方案是创建一个专门的锁定表,并只锁定该表中的一行。这样做的好处是只锁定那些明确想要被锁定的进程。即使更新进程在某个时刻接触到表,应用程序的其他部分仍然可以继续访问表。
设置
CREATE TABLE `mutex` (
EMPTY ENUM('') NOT NULL,
PRIMARY KEY (EMPTY)
);
使用方法
set innodb_lock_wait_timeout = 1;
start transaction;
insert into `mutex` values();
[... do the real work here ... or somewhere else ... even a different machine ...]
delete from `mutex`;
commit;
lock_wait_timeout
系统变量。LOCK TABLES
?LOCK TABLES
的MyISAM,则应转换为InnoDB。LOCK TABLES
。相反,依赖于innodb_lock_wait_timeout
(默认值过高为50秒),并应检查错误。innodb_lock_wait_timeout
。BEGIN;
SELECT ...;
compute some stuff
UPDATE ... (using that stuff);
COMMIT;
SELECT
语句的末尾添加 FOR UPDATE
。LOCK TABLES
。一个线程插入一行并调用 last_insert_id()
,该函数是特定于线程的,以获取唯一的 AUTO_INCREMENT
id。其他线程也是如此;它们将获得不同的id。或者...如果您没有使用 AUTO_INCREMENT
,请提供详细信息,以便我可以解释为什么它也不是问题。在任何构成“事务”的SQL语句组合周围,您都需要使用 BEGIN
... COMMIT
。 - Rick JamesLOCK TABLES
的好处在于,您可以在继续之前声明查询所依赖的表。在事务中,锁定是在最后一刻抓取的,如果无法获取并超时,则需要检查此失败并回滚,然后再次尝试所有操作。最简单的方法是在锁定表查询上设置1秒超时(最小值),并重试获取锁定直到成功,然后在解锁表之前继续执行查询。这种逻辑不会有死锁的风险。...避免使用LOCK TABLES语句,因为它不提供任何额外的保护措施,反而会减少并发性。
我认为你想说的是默认超时时间; 根据MySQL文档
,它是50秒
innodb_lock_wait_timeout 默认值为50 秒,在InnoDB事务放弃等待行锁之前等待的秒数。默认值为50秒。