繁体   English   中英

SQL,如何测试并发事务

[英]SQL, how to test concurrent transactions

比方说,有一个表something的列id, foo, bar, baz, qux, norf, updated_at和一个要测试,当谈到那些在此表上的工作事并发事务时可能出现的各种使用情况下,例如:

使用案例:如果您查看以下交易T1T2,例如如何测试其事务隔离级别插入来自T2将在第二选择可用的,假设T2将首先之间COMMIT和第二在T1选择

所以我在这里测试一些phantom read变化我猜,虽然SELECT语句不同

我唯一的想法是使用SELECT PG_SLEEP(N); 两个SELECT语句之间以及打开两个DB连接(例如某个DB客户端的2个实例,例如PgAdmin)一个用于处理T1而另一个用于处理T2而不是手动启动T1让第一个SELECT完成PG_SLEEP(10)将触发的位置,而不是手动启动T2并希望从T1看到结果集并手动比较它。 但似乎这是不可能的,因为我没有找到任何可以从2 + SELECT语句返回多个结果集的DB客户端。

(顺便说一句,使用一个SELECT而不是两个SELECT会很棒,不知何故合并到一个SELECT但我看不出怎么做)

T1:

START TRANSACTION;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
...
SELECT sum(foo) as foo
FROM something
WHERE bar = 1 AND updated_at <= '...' AND norf = 2
UNION ALL
SELECT sum(foo)
FROM something
WHERE bar = 1 AND baz IN (1, 9, 10) AND updated_at > '...'
GROUP BY bar;

SELECT PG_SLEEP(10);

SELECT bar, qux, sum(foo) AS foo
FROM something
WHERE norf = 2
GROUP BY bar, qux;

COMMIT;

T2:

START TRANSACTION;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
...
INSERT INTO something VALUES(...);
...
COMMIT;

请不要发布答案,例如“READ COMMITTED是postgre中的默认事务级别,你不需要指定它”我只是作为一个例子使用它,或者“你将通过在postgre中使用REPEATABLE READ来解决问题”,因为我想从测试中得到答案。

虽然我在几个地方提到postgre我正在使用mysqlsql-server因为问题与它们都没有关系。

我还检查了已提出的问题:
如何测试MySQL事务?
如何在本地测试并发?

对于Sql Server,我通过在Sql Server Management Studio中打开两个不同的窗口来测试这种类型的场景。 每个窗口都有自己与数据库的连接。 然后,我逐步执行T1和T2的相关部分,以重现所需的测试用例。

我相信你可以用其各自的工具与其他数据库做一些非常相似的事情。

例:

窗口1

START TRANSACTION;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
...
SELECT sum(foo) as foo
FROM something
WHERE bar = 1 AND updated_at <= '...' AND norf = 2
UNION ALL
SELECT sum(foo)
FROM something
WHERE bar = 1 AND baz IN (1, 9, 10) AND updated_at > '...'
GROUP BY bar;

窗口2

START TRANSACTION;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
...
INSERT INTO something VALUES(...);
...
COMMIT;

窗口1

SELECT bar, qux, sum(foo) AS foo
FROM something
WHERE norf = 2
GROUP BY bar, qux;

COMMIT;

暂无
暂无

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

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