2014-07-11 122 views
0

我需要一些关于交易和锁定的清晰度mysql交易和锁定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 非常感谢。

+1

你究竟想要做什么?在大多数情况下,您不必锁定表格。 InnoDB支持行级锁定。 –

+0

在考虑插入新数据之前,请检查tab1中的用户名是否未使用,并且电子邮件是否在tab2中未使用。由于新用户注册并不常见,我认为我可以承担独家访问。 – mdev

回答

1

使用事务时,表锁定由数据库引擎自动处理。使用显式锁定语句甚至可能不利于transactional code

13.3.5.1表锁定和交易互动

  • LOCK TABLES和UNLOCK TABLES与使用交易的互动如下:

  • 锁定表是不是交易安全的并试图锁定表之前暗中提交任何活动的事务。

  • UNLOCK TABLES隐式提交任何活动事务,但前提是锁定表已用于获取表锁。 [...]

虽然在脚本中伪代码,你只任何其他命令之前使用LOCK TABLE

从程序逻辑的角度来看,webapp的其他功能可能会触发相同表上的更新?如果您只想防止在交易过程中发生外部更新,则适当transaction isolation(即不是READ UNCOMMITED)应防止任何副作用蔓延。