我需要一些关于事务的清晰度并锁定mysql
首先。需要在不同的表中执行两次或三次插入,但如果其中任何一个失败,则取消整个操作。所以来了。
START TRANSACTION
但在所有需要线程成为访问这些表的唯一之前。来了
LOCK TABLES tab1 WRITE, tab2 WRITE
我应该先做什么? 是按照这个顺序进行的吗?
START TRANSACTION;
LOCK TABLE....;
INSERT INTO ...;
if (something wrong)
{
ROLLBACK;
UNLOCK TABLES;
return;
}
INSERT INTO ...;
if (something wrong)
{
ROLLBACK;
UNLOCK TABLES;
return;
}
COMMIT;
UNLOCK TABLES;
这篇文章有一些伪JAVA 非常感谢你。
答案 0 :(得分:1)
使用事务时,db引擎会自动处理表锁定。使用显式锁定语句甚至可能对transactional code:
有害13.3.5.1表锁定和交易的交互
LOCK TABLES和UNLOCK TABLES与交易的使用相互作用如下:
LOCK TABLES 不是事务安全的,并在尝试锁定表之前隐式提交任何活动事务。
UNLOCK TABLES隐式提交任何活动事务,但仅当LOCK TABLES用于获取表锁时才会提交。 [...]
虽然在您的脚本伪代码中,您只能在任何其他命令之前使用LOCK TABLE
。
从程序逻辑的角度来看,您的webapp的其他功能可能会触发相同表的更新?如果您只想阻止在事务中发生外部更新,则正确的transaction isolation(即不READ UNCOMMITED
)应该可以防止任何副作用。