相关疑难解决方法(0)

TransactionScope和多线程

我想知道在处理多线程时如何以正确的方式使用TransactionScope类?

我们在主线程中创建了一个新的作用域,然后我们生成了几个工作线程,并且我们希望它们参与主作用域,因此,例如,如果作用域永远不会完成,则会在每个作者上调用回滚.

我在内部使用ThreadStaticAttribute阅读了有关TransactionScope的内容,这使得上述不可能/非常困难 - 有人可以验证这两种方式吗?如果我们以同步方式运行代码,那么回滚就可以工作,即内部事务能够参与主事务,但是如果我们切换到线程执行则不行.

谢谢

.net multithreading transactions

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

TransactionScope在处置之前中止了交易

当使用TransactionScope时,它表示如果内部执行的代码回滚事务,那么父事务也将回滚.这对我有好处.但是当处置该范围时,它会抛出异常,这意味着事务已经回滚并且已中止.那么处理这个并正确处理范围的正确方法是什么?

    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
                    using (var conn = GetConnection())
                    {
                            string query = 
              @"some query that may contain transaction itself 
              or some SP whith transaction included"

                            using (var command = new SqlCommand(query, conn))
                                command.ExecuteNonQuery();
                        }
                    }
                    scope.Complete();
    } // Exception here
Run Code Online (Sandbox Code Playgroud)

c# sql transactions

7
推荐指数
1
解决办法
1万
查看次数

事务无法通过 Task.WhenAll 处理并行命令

我的 Postgres 数据库中有一些主表(如公司)和许多从属表(如 CompanyAddresses、CompanyPaymentInfos 等):

CREATE TABLE Companies (
Id uuid NOT NULL PRIMARY KEY,
...);

CREATE TABLE CompanyAddresses(
CompanyId uuid NOT NULL PRIMARY KEY REFERENCES Companies(Id),
...);

CREATE TABLE CompanyPaymentInfos(
CompanyId uuid NOT NULL PRIMARY KEY REFERENCES Companies(Id),
...);
Run Code Online (Sandbox Code Playgroud)

我在 C# 代码中使用标准库中的事务:

private TransactionScope GeTransactionScope()
{
    return new TransactionScope(
        TransactionScopeOption.RequiresNew,
        new TransactionOptions
        {
            IsolationLevel = IsolationLevel.ReadCommitted
        },
        TransactionScopeAsyncFlowOption.Enabled);
}

private async Task DoChange(...)
{
    using (var scope = GeTransactionScope())
    {
        await Insert(Company);

        await Task.WhenAll(
            Insert(CompanyPaymentInfo),
            Insert(CompanyAddress),
            Insert(CompanyTags),
            // so …
Run Code Online (Sandbox Code Playgroud)

c# postgresql transactionscope npgsql dapper

4
推荐指数
1
解决办法
1043
查看次数

多次打开和关闭SQL连接有多糟糕?有什么确切的效果?

例如,我需要使用SQLDataAdapter的Fill()方法填充大量DataTable:

DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
....
....
Run Code Online (Sandbox Code Playgroud)

即使所有的dataadapter对象都使用相同的SQLConnection,每个Fill方法都会打开和关闭连接,除非在方法调用之前连接状态已经打开.

我想知道的是,如何不必要地打开和关闭SQLConnections会影响应用程序的性能.需要扩展多少才能看到此问题的不良影响(100,000个并发用户?).在中型网站(每天50000个用户)中,是否值得烦恼并搜索所有Fill()调用,将它们保存在代码中并在任何Fill()调用之前打开连接并在之后关闭?

sql-server sqlconnection fill sqlperformance sqldataadapter

3
推荐指数
1
解决办法
3107
查看次数