假设我有一个连接到n数据库的Windows窗体应用程序,n同时打开连接.
我正在寻找的是一次性与所有这些数据库进行交易.
例如,如果我有2个数据库连接:
using (ITransaction tx1 = session1.OpenTransaction())
{
using (ITransaction tx2 = session2.OpenTransaction())
{
// Do the query thingy here
}
}
Run Code Online (Sandbox Code Playgroud)
写一切都很好,但是当我想在这里和那里查询时,事情变得多余,更不用说添加新连接的可能性了.
我想要的是循环所有已注册的会话并将其包装在服务中,可能是这样的:
class TransactionManager
{
private ISession[] _sessions;
public TransactionManager(string[] connectionStrings)
{
// Initialize the sessions here
}
public function DoTransaction(string query)
{
foreach (ISession session in _sessions)
{
// What to do here? Using? Try-catch?
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在foreach循环中使用use ,则意味着如果连接A成功但连接B不成功,那么只有连接B将被回滚.
我有一个我想提交的事务,但不确定是否会在任何失败时回滚.我知道我可以在c#中使用TransactionScope,如果发生错误,所有内容都将被回滚.但我不太确定存储过程中的事务.所有在线示例都使用ROLLBACK关键字回滚.如果我没有ROLLBACK关键字那会怎么样?
CREATE PROCEDURE CreatePost
@type INT,
@name VARCHAR(500)
AS
BEGIN
DECLARE @insertedId TABLE(Id INT)
DECLARE @id INT
BEGIN TRANSACTION
INSERT INTO [Post] ([Name], [Type])
OUTPUT inserted.Id INTO @insertedId
VALUES (@name, @type)
UPDATE [Tables] SET Ordinals =ordinals + 1
WHERE Id = @tableId
COMMIT
END
Run Code Online (Sandbox Code Playgroud)