使用多个线程进行事务和锁定

时间:2016-09-19 07:10:23

标签: c++ mysql database innodb

嗨以下是问题所在:

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

START TRANSACTION

截断my_table

将数据infile加载到表my_table中。

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

其他ROLLBACK

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

从my_table中选择*

错误:在此读取尝试的某个时间它获得0数据,这可能是什么原因?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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是原子的,非常快。