是否可以在不使用表的情况下使用SQL Server事务?

时间:2018-08-07 01:15:28

标签: sql-server tsql transactions distributed-system

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

我知道我可以使用ZooKeeper之类的东西,但这是为一件小事设置的大量基础结构。

我当时想我可以在事务中访问的SQL Server中创建一个表。这可以工作,但看起来却有些杂乱无章(如果后来有人发现表中没有任何东西并决定删除它,该怎么办?)

我想知道是否有一种方法可以在T-SQL / SQL Server中创建“命名”事务(由我自己决定)?

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

2 个答案:

答案 0 :(得分:1)

一种方法是使用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;

答案 1 :(得分:0)

原来是内置物

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();
    }
}