首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个INSERT的事务而不锁定表

问使用多个INSERT的事务而不锁定表
EN

Stack Overflow用户
提问于 2016-10-13 21:25:18
回答 2查看 4.3K关注 0票数 3

我有脚本在数据库中创建相同的数据。看上去:

代码语言:javascript
复制
START TRANSACTION;
INSERT INTO table (data);
INSERT INTO table (data);
INSERT INTO table (data);
...
COMMIT;

剧本运行了大约30分钟。但是,当它工作时,该表被锁定,以供其他插入。在脚本结束之前,我无法在另一个进程中插入任何行。有必要吗?我想用交易,但我不能锁整张桌子。有什么办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-13 21:27:54

你能做以下事情吗?

代码语言:javascript
复制
START TRANSACTION;
INSERT INTO table (data);
COMMIT;
START TRANSACTION;
INSERT INTO table (data);
COMMIT;
...
START TRANSACTION;
INSERT INTO table (data);
COMMIT;

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

如果您需要整个项目是一个事务,那么最好的方法是:

代码语言:javascript
复制
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;

您希望延迟事务的启动,直到所有处理完成为止。

票数 4
EN

Stack Overflow用户

发布于 2016-10-13 21:42:39

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

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40031264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档