Mysql SQL,如何测试并发事务

Mysql SQL,如何测试并发事务,mysql,sql,sql-server,postgresql,transactions,Mysql,Sql,Sql Server,Postgresql,Transactions,假设有一个表something,其中列id、foo、bar、baz、qux、norf、updated_at,您需要测试在该表上处理某些事务的并发事务时可能出现的各种用例,例如: 用例:如果您检查下面的事务T1和T2,例如,假设T2将在T1?中的第一次选择和第二次选择之间提交,那么如何测试从T2插入的事务隔离级别在第二次选择中可用 所以我在这里测试的是幻影读取的一些变体,我猜,尽管SELECT语句是不同的? 我唯一的想法是使用选择PG_SLEEP(N)并打开两个DB连接(例如某些DB客户端的两个实

假设有一个表
something
,其中列
id、foo、bar、baz、qux、norf、updated_at
,您需要测试在该表上处理某些事务的并发事务时可能出现的各种用例,例如:

用例:如果您检查下面的事务T1T2,例如,假设T2将在T1?中的第一次选择和第二次选择之间提交,那么如何测试从T2插入的事务隔离级别在第二次选择中可用

所以我在这里测试的是幻影读取的一些变体,我猜,尽管SELECT语句是不同的

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

(顺便说一句,使用一个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;
START TRANSACTION;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
...
INSERT INTO something VALUES(...);
...
COMMIT;
请不要发布答案,例如“READ COMMITTED是postgre中的默认事务级别,您不需要指定它”我只是将其用作示例,或者“您将通过在postgre中使用可重复读取来解决问题”,因为我希望从测试中获得该答案

虽然我在几个地方提到了postgre,但我使用的是
mysql
sql server
,因为这两个问题都不相关

我还检查了已经提出的问题:


对于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;
SELECT bar, qux, sum(foo) AS foo
FROM something
WHERE norf = 2
GROUP BY bar, qux;

COMMIT;
窗口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;
SELECT bar, qux, sum(foo) AS foo
FROM something
WHERE norf = 2
GROUP BY bar, qux;

COMMIT;

你真的在使用MySQL、SQL Server和Postgresql吗?不要给未涉及的产品贴标签…我很接近,但到目前为止,谢谢你的解释