簡體   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