mysql锁表被忽略

cclgggtu  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(384)

我遇到了myisam引擎的mysql表锁的奇怪问题。
假设我有这样的代码:

LOCK TABLES t1 WRITE;
SELECT SQL_NO_CACHE val1 FROM t1 WHERE something; // val1 = old
// some conditions on val1 and logic
UPDATE t1 SET val1 = new WHERE something;
UNLOCK TABLES;

据我所知,这应该可以防止任何并发更新。但事实并非如此。有时它只是忽略锁,在另一个线程将其更改为“new”后,val1中读取“old”。我甚至使用sql无缓存来防止错误地检索旧数据。
为什么?我怎样才能确定地阻止更新竞速?
谢谢。
mysql 5.5.28、myisam、php5.2、mysql\扩展(已过时,但在遗留项目上)
编辑:
好吧,这不应该发生在纯sql中,所以有php代码:

<?php
$conn = mysql_connect(...);

...

mysql_query("LOCK TABLES t1, t2 WRITE"); //t2 also used
$result = mysql_fetch_array(mysql_query("SELECT last_user, ... FROM t1 WHERE id = XXX"));

if($result["last_user"] != $session_user) { //is last activity from another than current user?
 DoStuffWithUser(...); //custom function which uses t2 table
 mysql_query("UPDATE t1 SET last_user = ".$session_user." WHERE id = XXX");
}

mysql_query("UNLOCK TABLES");
...
?>

结果是,对当前用户多次调用dostuffwithuser()。
没有特殊的应用程序,驱动程序,框架。只是内置的php函数。
看起来,这个问题主要是(我不能确定是否是独占的)当一个用户多次执行操作时-双击,一些网络故障,等等。

flvlnr44

flvlnr441#

好的,这是我今天的歌https://www.youtube.com/watch?v=48rz8udzbmq
许多泰克人对我的正确做法表示感谢。
好吧,哪里出错了,我们去找吧。第一行,简单的锁查询,没有什么要检查的,很明显。。。哦,等等。。。

LOCK TABLES t1**WRITE**, t2 WRITE

每个表都必须设置锁类型:)

相关问题