在資料庫應用開發中,並發測試是驗證系統在高負載下穩定性與效能的關鍵環節。SQL Server 作為企業級關聯式資料庫,其並發處理能力直接影響業務系統的響應速度與資料一致性。本文將深入剖析兩種主流的並發測試方法,並透過實際程式碼示範如何使用自動化工具直接對資料庫進行高效測試。
此方法透過測試工具(如 LoadRunner、JMeter)模擬多個真實用戶透過應用層(Web 伺服器、應用伺服器)存取資料庫。
測試工具直接以資料庫連線字串連接 SQL Server,繞過應用層發送並發 SQL 指令。
以下示範建立測試環境(資料表與預存程序),並說明測試邏輯:模擬多線程並發呼叫預存程序 dbo.Test,該程序在交易中讀取計數器、加一後更新,驗證並發更新下的資料一致性。
在 SQL Server Management Studio (SSMS) 或 Query Analyzer 中執行下列 T-SQL 腳本:
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Test]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[Test]
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[testtable]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[testtable]
GO
CREATE TABLE [dbo].[testtable] (
[testid] [int] NULL,
[counts] [int] NULL
) ON [PRIMARY]
GO
INSERT INTO testtable (testid, counts) VALUES (1, 0)
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE dbo.Test
AS
DECLARE @count INT
BEGIN TRAN TEST
SELECT @count = counts FROM testtable WHERE testid = 1
UPDATE testtable SET counts = @count + 1
IF (@@ERROR > 0)
ROLLBACK TRAN TEST
ELSE
COMMIT TRAN TEST
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
使用 Robot Framework 的 DatabaseLibrary 或類似庫,編寫關鍵字:
EXEC dbo.Test。counts 值是否等於並發執行緒數(若無鎖升級或死鎖,理論值應等於執行次數)。sys.dm_tran_locks 與 sys.dm_os_wait_stats 分析鎖爭用與等待類型。TRY...CATCH 替代 @@ERROR 進行現代化錯誤處理重構。「直連資料庫腳本法」是並發測試的高效首選,能在開發早期精準暴露資料庫層的競爭條件與鎖效能問題。結合自動化測試框架(如 Robot Framework、pytest)與 CI/CD 流程,可建立持續的資料庫效能防線。