2011-07-28 39 views
1

我有2个并行运行的cron进程。mysql - 多次插入后如何提交

进程1插入并处理2读取这些插入。

我遇到的问题是进程1需要在进程2读取它们之前插入多行。

例如, 1.方法1需要插入10行

  1. 过程1个插入3行

  2. 方法2读取这些3行

  3. 工序1将行4 ..10

  4. 过程2读取4..10行

我需要什么是

  1. 处理1行插入1..10

  2. 流程2读取行1..10

A)我是否锁过程1中插入的​​表格?

B)我做了一个开始交易,做插入,然后提交?

如果表被锁定,其他会话解锁或其他会话将获得锁定错误/警告?

回答

3

不要锁定表格。使用交易。事务是原子的。

+0

确实,你想使用交易。 InnoDB存储引擎支持事务处理 - 它们不受MyISAM支持。 – TehShrike

+0

@Ken你的问题是使用交易的教科书示例。 – Hyperboreus

+0

我不同意。事务在这里不会解决问题。交易不会阻止其他交易。 –

0

如果您需要阻止进程2,直到进程1完成,您应该按照您的建议锁定有问题的表。

如果在单个查询中插入了所有10行,则可以依赖MyISAM表锁定,但是,如果使用单独查询插入或使用InnoDB插入,则需要使用[LOCK TABLES .. WRITE](http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html),并在完成后释放锁。

进程2然后会在从表中读取数据之前,等待写入锁释放。

这里确保服务器首先接收进程1中的查询非常重要,因此您可能希望在那里使用一些魔法。

如果要确保所有插入都是以原子方式添加的,则可以将插入包装在事务中,但仍需要锁定表以解决并发问题。