【问题标题】:Use one SQL Connection with multiple transactions对多个事务使用一个 SQL 连接
【发布时间】:2011-09-19 11:45:19
【问题描述】:

我有一个 vb.net 网络应用程序,我正在将一个 SQL 连接和一个事务传递给一个将单个记录写入数据库的方法。

我想为每条写入的记录启动并提交一个事务,但使用相同的 sql 连接,直到循环完成。

我看到的一个方法是使用 using 语句,但它对我不起作用。它第一次运行并在第二次出现错误,表明事务已经提交

Using sqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
  sqlConnection.Open()
  Using transaction = sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted)

      For Each user In users
         Try
            myDataWriteMethod(user, conn, tr)

         Catch ex As Exception
            tranaction.rollback()
         End Try
         transaction.commit()
      Next 
    End Using
End Using  

【问题讨论】:

  • 你能发布一些代码
  • 除了您的问题的答案之外,您的错误处理永远不会正常工作 - 您将回滚事务,退出 Try 块,然后尝试提交相同的事务。如果您想单独提交每个循环迭代,请将提交移到 Try 块内,作为 Catch 块之前的最后一条语句。

标签: sql vb.net transactions


【解决方案1】:

看起来好像您在 for 循环的每一步都提交或回滚事务。您可能需要 (1) 为每个用户开始一个新事务,例如,

Using sqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
  sqlConnection.Open()
  For Each user In users
      Using transaction = sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted)
      ...

或(2)只在最后提交或回滚事务,例如

Using sqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
  sqlConnection.Open()
  Using transaction = sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted)

      Try
          For Each user In users
              myDataWriteMethod(user, conn, tr)
          Next
      Catch ex As Exception
          tranaction.rollback()
      End Try

      transaction.commit()
  End Using
End Using

请注意,我不是 VB.NET 程序员,所以我的语法可能有误。

【讨论】:

  • 谢谢...如果你能帮助我在代码执行两次时遇到错误,例如两个用户同时使用应用程序“SqlConnection 不支持并行事务。”
  • @Adonis L:您能否以某种方式重用您创建的 SqlConnection 或尝试在提交当前事务之前打开一个新事务?
  • 我不相信,当一个用户执行时它运行良好,但是当有并发用户时它失败了,using语句应该为每个用户打开一个新连接
【解决方案2】:

这应该做你想做的。

Using sqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
    sqlConnection.Open()
    For Each user In users
        Using transaction = sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted)
            Try
                myDataWriteMethod(user, conn, tr)
                transaction.Commit()
            Catch ex As Exception
                transaction.Rollback()
            End Try
        End Using
    Next   
End Using  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2012-01-08
    • 2020-12-24
    • 2018-01-07
    • 2012-09-04
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多