具有许多插入的事务,无需锁定表



我有脚本,是在数据库中创建相同的数据。它看起来像:

START TRANSACTION;
INSERT INTO table (data);
INSERT INTO table (data);
INSERT INTO table (data);
...
COMMIT;

脚本运行约30分钟。但是当它工作时,表被锁定以供其他insert使用。我不能插入任何行从另一个进程,直到脚本结束。有必要吗?我想使用事务,但是我不能锁定整个表。有什么办法吗?

你能不能改成:

START TRANSACTION;
INSERT INTO table (data);
COMMIT;
START TRANSACTION;
INSERT INTO table (data);
COMMIT;
...
START TRANSACTION;
INSERT INTO table (data);
COMMIT;

不是最优雅的,但它应该根据你描述的情况解决你的问题。

如果你需要整个项目是一个TRANSACTION,那么最好的方法是这样做:

INSERT INTO tmpTableA (dataX);
INSERT INTO tmpTableB (dataY);
INSERT INTO tmpTableC (dataZ);
...
'   Do all the "building / processing above using temp tables either in memory or on disc, and then only when all the "heavy lifting" is done; update/insert the data into your tables.
...
START TRANSACTION;
INSERT INTO tableA (tmpTableA);
UPDATE tableB.foo = tmpTableB.fee WHERE BlahBlobBlah;
INSERT INTO tableC (tmpTableC);
COMMIT;

您想要延迟启动TRANSACTION,直到所有的处理完成。

您应该创建一个临时表:table_temp将所有数据插入到table_temp中,当你准备好了,你可以将所有临时数据插入到最终表中:

START TRANSACTION;
INSERT INTO table_temp (data);
INSERT INTO table_temp (data);
INSERT INTO table_temp (data);
insert into table
select * from table_temp;
commit;

最新更新