我可以在不使用 table 的情况下使用 SQL 服务器事务吗?

Can I use SQL Server transaction without using a table?

我有两台服务器可能都尝试执行某些操作。我想要某种形式的分布式锁,以便一次只有一个人执行此操作。

我知道我可以使用 ZooKeeper 之类的东西,但是要为一件小事设置很多基础设施。

我想我可以在 SQL 服务器中创建一个 table 我在事务中访问的服务器。这行得通,但似乎 hacky/messy(如果有人后来发现 table 什么也没有,然后决定删除它,等等)

我想知道是否有一种方法可以在 T-SQL/SQL 服务器中创建 'named' 事务(我编造的术语)?

FWIW 我正在使用 Entity Framework 进行数据访问,但如果需要,我总是可以使用原始 ADO.net。

原来这是一个内置的东西

DECLARE @TranName VARCHAR(20);  
SELECT @TranName = 'MyTransaction';  

BEGIN TRANSACTION @TranName;  
USE AdventureWorks2012;  
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate  
WHERE JobCandidateID = 13;  

COMMIT TRANSACTION @TranName;  

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/begin-transaction-transact-sql?view=sql-server-2017#c-naming-a-transaction

而在 C# 领域,使用 ADO.Net

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    // Start named  transaction.
    transaction = connection.BeginTransaction("MyTransaction");

    try
    {      
        //Do work you want locked globally
    }
    finally{
        transaction.Commit();
    }
}

一种方法是使用 sp_getapplock 在您自己命名的资源上获取会话级锁。锁将一直持有,直到明确释放或会话结束。

DECLARE @return_code int;
EXEC @return_code = sp_getapplock
     @Resource = 'YourResource'
    ,@LockMode = 'Exclusive'
    ,@LockOwner = 'Session'
    ,@LockTimeout = 0;
RAISERROR('sp_getapplock return code is %d', 0, 0, @return_code) WITH NOWAIT;