[英]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.