我对事务和锁表的区别有点困惑,锁表是为了确保数据库完整性和 SELECT 和 UPDATE 保持同步,没有其他连接干扰它。我需要:
SELECT * FROM table WHERE (...) LIMIT 1
if (condition passes) {
// Update row I got from the select
UPDATE table SET column = "value" WHERE (...)
... other logic (including INSERT some data) ...
}
我需要确保没有其他查询会干扰并执行相同的 SELECT
(在该连接完成更新行之前读取“旧值”)。
我知道我可以默认使用 LOCK TABLES table
来确保每次只有一个连接执行此操作,并在完成后解锁它,但这似乎有点过了。在事务中包装它是否会做同样的事情(确保在其他连接仍在处理时不会有其他连接尝试相同的进程) ?或者 SELECT ... FOR UPDATE
或 SELECT ... LOCK IN SHARE MODE
会更好?