我有两个并行运行的cron进程。
进程1执行插入,进程2读取这些插入。
我遇到的问题是进程1需要在进程2可以读取它们之前插入多行。
例如,1. 进程1需要插入10行
进程1插入3行
进程2读取这3行
进程1插入第4 ~ 10行
进程2读取第4 ~ 10行
我需要的是
进程1行插入1..10
进程2读取第1 ~ 10行
A)我是否为进程1中的插入锁定表?
B)我做一个开始事务,插入,然后提交吗?
如果表是锁定的,其他会话将如何解锁或其他会话将获得锁错误/警告?
不要锁表。使用事务。事务是原子的
如果您需要阻塞进程2直到进程1完成,那么您应该按照您的建议,锁定相关表。
如果你在一个查询中插入所有10行,你可以依赖MyISAM表锁定,但是,如果你使用单独的查询或使用InnoDB插入,你将需要显式地使用[lock tables]锁定表。在进程1中写入[http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html],并在完成后释放锁。
进程2在从表中读取数据之前,会等待写锁被释放。
确保服务器首先接收进程1中的查询是非常重要的,因此您可能希望在这里使用一些魔法。
如果您想确保所有的插入都是自动添加的,您可以将插入包装在事务中,但是您仍然需要锁表来解决并发性问题。