TransactionScope 的错误解决方法

 TransactionScope  是.net 提供的可提升事务环境,开发软件的时候非常方便,但是在大数据量处理的时候,会莫名我出错,检查代码没有任何的错误

解决这个错误的方法:不用TransactionScope  ,自己写一个用MSDTC的事务就可以了。

我的项目里面用的就是这TransactionScope  ,但是在导入数据的时候,超过1万条记录(3张表)的时候,系统就报错了。数据在7000条的时候,没有任何问题。没有解决办法。

最好只好改变思路,不使用TransactionScope  ,参照微软的COM+1.5的帮助,写了下面的。插入5万条记录的时候,包括从客户端传到服务器端共花了7分钟,没有任何问题。

在.net 2.0的环境下,建议大家不好用TransactionScope  。

    public enum TransactionScopeOption
    {
        Suppress = TransactionOption.NotSupported,
        Required = TransactionOption.Required,
        RequiresNew = TransactionOption.RequiresNew
    }

    public class TransactionScope : IDisposable
    {
        bool m_Consistent = false;

        public void Complete()
        {
            if (m_Consistent == false)
            {
                m_Consistent = true;
                ContextUtil.MyTransactionVote = TransactionVote.Commit;
            }
            else
            {
                throw new InvalidOperationException("Cannot call Complete() more than once");
            }
        }
        public TransactionScope()
            : this(TransactionScopeOption.Required)
        { }

        public TransactionScope(TransactionScopeOption scopeOption)
        {
            ServiceConfig config = new ServiceConfig();
            config.Transaction = (TransactionOption)scopeOption;
             ServiceDomain.Enter(config);
            ContextUtil.MyTransactionVote = TransactionVote.Abort;
        }

        public void Dispose()
        {
            if (m_Consistent == false && ContextUtil.IsInTransaction)
            {
                ContextUtil.MyTransactionVote = TransactionVote.Abort;
            }
            ServiceDomain.Leave();
            m_Consistent = false;
        }
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的使用TransactionScope的代码示例,用于演示如何将多个数据库操作包装在一个事务中: ``` using System; using System.Data.SqlClient; using System.Transactions; class Program { static void Main() { // 创建一个连接字符串 string connectionString = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=TestDB;Integrated Security=True"; // 创建一个事务范围对象 using (TransactionScope scope = new TransactionScope()) { try { // 执行第一个数据库操作 using (SqlConnection connection1 = new SqlConnection(connectionString)) { connection1.Open(); SqlCommand command1 = new SqlCommand("INSERT INTO Customers (Name) VALUES ('Customer 1')", connection1); command1.ExecuteNonQuery(); } // 执行第二个数据库操作 using (SqlConnection connection2 = new SqlConnection(connectionString)) { connection2.Open(); SqlCommand command2 = new SqlCommand("INSERT INTO Orders (CustomerId, OrderDate) VALUES ((SELECT TOP 1 Id FROM Customers ORDER BY Id DESC), GETDATE())", connection2); command2.ExecuteNonQuery(); } // 提交事务 scope.Complete(); } catch (Exception ex) { // 回滚事务 Console.WriteLine("Transaction rolled back: " + ex.Message); } } } } ``` 在这个示例中,我们使用了TransactionScope类来创建一个事务范围,然后在这个范围内执行了两个数据库操作。如果两个操作都成功执行,我们调用了TransactionScope的Complete方法来提交事务。如果其中任何一个操作失败,我们就会在catch块中回滚事务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值