相关疑难解决方法(0)

C#控制跨多个数据库的事务

假设我有一个连接到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将被回滚.

.net c# transactionscope

25
推荐指数
2
解决办法
2万
查看次数

如果发生错误,是否会回滚此事务

我有一个我想提交的事务,但不确定是否会在任何失败时回滚.我知道我可以在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)

sql sql-server sql-server-2014

2
推荐指数
1
解决办法
129
查看次数

标签 统计

.net ×1

c# ×1

sql ×1

sql-server ×1

sql-server-2014 ×1

transactionscope ×1