我可以在不使用 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;
而在 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;
我有两台服务器可能都尝试执行某些操作。我想要某种形式的分布式锁,以便一次只有一个人执行此操作。
我知道我可以使用 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;
而在 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;