如何使用 PowerShell 创建这种 SQL Server 阻塞场景?

问题描述 投票:0回答:1

我可以在 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 时,我没有得到阻止。为什么?如何解决?

sql-server powershell blocking
1个回答
1
投票

事务在 $conn.Close() 上回滚。如果您在单独的 powershell 会话中运行并且不关闭连接,您将看到阻塞。

© www.soinside.com 2019 - 2024. All rights reserved.