我有两台可能都尝试执行某些操作的服务器。我想要某种形式的分布式锁,以便一次只能执行一次此操作。
我知道我可以使用ZooKeeper之类的东西,但这是为一件小事设置的大量基础结构。
我当时想我可以在事务中访问的SQL Server中创建一个表。这可以工作,但看起来却有些杂乱无章(如果后来有人发现表中没有任何东西并决定删除它,该怎么办?)
我想知道是否有一种方法可以在T-SQL / SQL Server中创建“命名”事务(由我自己决定)?
FWIW我正在使用实体框架进行数据访问,但是如果需要,我总是可以使用原始ADO.net。
答案 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;
在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();
}
}