【问题标题】:mysql - How to commit after multiple insertsmysql - 多次插入后如何提交
【发布时间】:2012-07-23 22:53:37
【问题描述】:

我有 2 个 cron 进程并行运行。

进程 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) 我是否执行开始事务、执行插入然后提交?

如果表被锁定,其他会话是否会解锁或其他会话会收到锁定错误/警告?

【问题讨论】:

    标签: mysql transactions cron


    【解决方案1】:

    不要锁定桌子。使用事务。事务是原子的。

    【讨论】:

    • 没错,你想使用事务。 InnoDB 存储引擎支持事务 - MyISAM 不支持它们。
    • @Ken 你的问题是使用交易的教科书示例。
    • 我不同意。事务不会解决这里的问题。交易不会阻止其他交易。
    【解决方案2】:

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

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

    然后进程 2 将在从表中读取之前优雅地等待写锁被释放。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-12
      • 2016-06-29
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2022-01-12
      • 2013-08-01
      相关资源
      最近更新 更多