繁体   English   中英

如何在PostgreSQL中同时运行多个事务

[英]How to run multiple transactions concurrently in PostgreSQL

我想在PostgreSQL上做一些基本的实验,例如生成死锁,创建不可重复的读取等等。但我无法弄清楚如何一次运行多个事务来查看这种行为。 谁能给我一些想法?

打开多个psql会话,每个会话一个终端。

如果您使用的是Windows,则可以通过多次启动菜单启动psql来实现。 在其他平台上打开几个新终端或终端选项卡,并在每个终端启动psql

我在检查锁定和并发问题时经常这样做,在以下答案中使用:

......可能更多。 想要设置竞争条件时,一个有用的技巧是打开第三个psql会话和BEGIN; LOCK TABLE the_table_to_race_on; BEGIN; LOCK TABLE the_table_to_race_on; 然后在其他会话中运行语句; 他们会阻挡锁。 ROLLBACK持有表锁的事务和其他会话将竞争。 它并不完美,因为它不模拟偏移启动时并发,但它仍然非常有用。

其他替代方案在后面的答案中概述了类似的主题。

pgbench可能是你的最佳解决方案。 它允许您测试不同的复杂数据库资源争用,死锁,多客户端,多线程访问。

要获得交易,你可以简单地对这样的一些脚本('bench_script.sql):

DECLARE cnt integer DEFAULT 0;
BEGIN;
LOCK TABLE schm.tbl IN SHARE MODE;
select count(*) from schm.tabl into cnt;
insert into schm.tbl values (1 + 9999*random(), 'test descr' );
END;

并使用-f参数将其传递给pgbench。

有关pgbench的更详细用法,我建议您阅读postgreSQL pgBench的官方手册

最近在这里解决了我的pgbench问题。

Craig Ringer提供了一种手动打开多个事务的方法,如果发现不是很方便,可以使用pgbench一次运行多个事务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM