【问题标题】:Transaction and Locking with multiple threads多线程事务和锁定
【发布时间】:2016-09-23 08:32:45
【问题描述】:

您好,以下是问题场景:

我正在使用 MYSQL(Innodb 引擎),我的一个应用程序(C++/MYSQLCAPI)正在执行以下操作:

开始交易

截断 my_table

将数据 infile 加载到表 my_table 中。

如果上述命令 [truncate 和 load ] 都成功则 COMMIT

否则回滚

现在另一个应用程序(C++/MYSQLCAPI)通过以下命令每秒读取此表。

从 my_table 中选择 *

错误:在此读取尝试中,有时它会获得 0 数据,这可能是什么原因?

【问题讨论】:

  • 我猜读者没有得到数据,因为他试图设置一个读锁(取决于隔离级别)并且因为你的事务而没有获得锁。这样他就可以尝试使用 nolock 进行 reda。
  • 不,阅读器应用程序没有使用任何锁。

标签: c++ mysql database innodb


【解决方案1】:
CREATE TABLE new LIKE real;
load `new` by whatever means
if something went wrong, don't do the next two steps.
RENAME TABLE real TO old, new TO real;
DROP TABLE old;

这避免了您提到的问题以及许多其他问题。特别是,它不需要特殊的事务处理; RENAME 是原子的并且非常快。

【讨论】:

    【解决方案2】:

    truncate table has an implicit commit 以来,您看到的是一张空桌子。如果需要在事务中更改整个表可以使用删除然后插入,或者尝试重命名解决方案presented in this answer

    【讨论】:

    • 非常感谢 Broadbent 提供此信息。我现在要实施这个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    相关资源
    最近更新 更多