我的应用程序中有一个实用工具,需要执行批量插入、更新和删除操作。我试图在这些操作的周围创建事务,以便一旦调用此系统并将数据提供给它,就确保将所有数据全部添加到数据库中或全部不添加。
我的担忧是什么时候会出现边界条件?我可以在一个事务中有多少个插入、更新和删除操作?事务大小是否可配置?
我的应用程序中有一个实用工具,需要执行批量插入、更新和删除操作。我试图在这些操作的周围创建事务,以便一旦调用此系统并将数据提供给它,就确保将所有数据全部添加到数据库中或全部不添加。
我的担忧是什么时候会出现边界条件?我可以在一个事务中有多少个插入、更新和删除操作?事务大小是否可配置?
我认为在一个事务中执行的工作量没有上限。数据不断被添加到表文件中,最终事务要么提交要么回滚:根据我的理解,这个结果会被存储在pg_clog中;如果它回滚了,这个空间最终会被vacuum回收。因此,进行中的事务工作并不会在提交时被保留在内存中并被刷新。
一次事务可以运行大约20亿条命令(2^31,减去一点点开销。想一想,实际上可能是2^32——我认为commandcounter是无符号的)。
当然,每个命令都可以修改多行。
我参与的一个项目需要执行2000万次INSERT操作。我尝试过使用一个大事务和每一百万次INSERT操作使用一个单独的事务,但是性能表现完全相同。
使用的数据库版本是PostgreSQL 8.3。
我相信最大的工作量受到日志文件大小的限制。数据库永远不会允许自己无法回滚,因此,如果在事务期间消耗了所有的日志空间,它将停止,直到您提供更多的空间或回滚。这通常适用于所有数据库。
我建议将更新划分为可管理的块,执行时间最长不超过几分钟,这样您就可以在更早的时间发现问题(例如,通常需要1分钟的操作在10分钟后仍在运行...嗯,是有人删除了索引吗?)
.sql
文件中,我可以这样做:-begin;
(开始事务),随后是大量插入SQL语句(大约有200万个插入语句);commit;
(提交事务)。 - firstpostcommenter