我可以在 SSMS 中使用 TSQL 轻松创建 SQL Server 阻塞场景。在 SSMS 选项卡 1 中运行以下代码。
USE tempdb;
DROP TABLE IF EXISTS SampleTable;
CREATE TABLE SampleTable (ID INT PRIMARY KEY, Name NVARCHAR(50));
INSERT INTO SampleTable (ID, Name)
VALUES
(1, 'John'),
(2, 'Jane'),
(3, 'Jim');
在 SSMS 选项卡 2 中运行:
USE tempdb;
BEGIN TRANSACTION;
UPDATE dbo.SampleTable SET Name = 'Jack' WHERE ID = 2;
在 SSMS 选项卡 1 中运行:
USE tempdb;
UPDATE SampleTable SET Name = 'Jack2' WHERE ID = 2;
现在我可以看到最后一个
UPDATE
语句被阻止了。我想在 PowerShell 中模仿这种行为。下面是我的代码。
function runit($SQL, $Database = "master", $Server = ".") {
$conn = New-Object System.Data.SqlClient.SQLConnection("Data Source=$Server;Integrated Security=SSPI;Initial Catalog=$Database")
$cmd = New-Object System.Data.SqlClient.SqlCommand($SQL, $conn)
$cmd.CommandTimeout = 600 # 10 minutes
$conn.Open()
Write-Output "$($cmd.ExecuteNonQuery()) rows affected"
$conn.Close()
$results
}
$inst = "."
runit -Server $inst -SQL @"
USE tempdb;
DROP TABLE IF EXISTS SampleTable;
CREATE TABLE SampleTable (ID INT PRIMARY KEY, Name NVARCHAR(50));
INSERT INTO SampleTable (ID, Name)
VALUES
(1, 'John'),
(2, 'Jane'),
(3, 'Jim');
"@
runit -Server $inst -SQL @"
USE tempdb;
BEGIN TRANSACTION;
UPDATE dbo.SampleTable SET Name = 'Jack' WHERE ID = 2;
"@
runit -Server $inst -SQL @"
USE tempdb;
UPDATE SampleTable SET Name = 'Jack2' WHERE ID = 2;
"@
如您所见,我有一个 PowerShell 函数
runit
,它执行一段 TSQL。我基本上运行了三个相同的 TSQL。但是当我签入 SSMS 时,我没有得到阻止。为什么?如何解决?
事务在 $conn.Close() 上回滚。如果您在单独的 powershell 会话中运行并且不关闭连接,您将看到阻塞。