【问题标题】:mysql transaction (commit and rollback)mysql事务(提交和回滚)
【发布时间】:2012-12-24 12:34:24
【问题描述】:

下面是我用于 MySqlTransaction 的代码,它运行良好.... 但问题是因为我使用 mysqlcommand 的单个实例,所以我必须在其中使用唯一的 PARAMETER。这破坏了我的查询。有没有其他方法可以做......

我尝试在每次查询后处理 cmd 但没有用.. :(


          con.Open()
            Dim sqlTran As MySqlTransaction = con.BeginTransaction()
            Dim cmd As MySqlCommand = con.CreateCommand()
            cmd.Transaction = sqlTran
            Dim str As String = Nothing
            Try
                cmd.CommandText = "SELECT myid FROM memaster where    Adate=@adate and ANo=@ano and ASource=@asrc"
                cmd.Parameters.AddWithValue("@adate", txt_bpass_adate.Text)
                cmd.Parameters.AddWithValue("@ano", txt_bpass_af.Text)
                cmd.Parameters.AddWithValue("@asrc", txt_bpass_asource.Text)
                str = cmd.ExecuteScalar()
                'cmd.Dispose()'
                If str Is Nothing Then

                    cmd.CommandText = "Insert into memaster (ADate,ANo,ASource) values (@aDate,@aNo,@aSRC)"
                    cmd.Parameters.AddWithValue("@aDate", txt_bpass_adate.Text)
                    cmd.Parameters.AddWithValue("@aNo", txt_bpass_af.Text)
                    cmd.Parameters.AddWithValue("@aSRC", txt_bpass_asource.Text)

     cmd.ExecuteNonQuery()
    End If
     sqlTran.Commit()

            Catch ex As Exception
                Try
                    sqlTran.Rollback()
                Catch ex1 As Exception

                End Try
            End Try

我实际上想在单个事务中触发超过 4 个查询,这样如果出现任何问题,我可以回滚它...

如果有人有任何其他方法,请与我分享这个概念......


     For index As Integer = 1 To 5
                    cmd.CommandText = "Insert into detail (ID,BNos,SNo) values (@FID1,@BNo,@SeqN1)"
                    cmd.Parameters.AddWithValue("@FID1", str)
                    cmd.Parameters.AddWithValue("@BNo", str1)
                    cmd.Parameters.AddWithValue("@SeqN1", txt_bpass_sqn1.Text)
                    cmd.ExecuteNonQuery()


                Next

【问题讨论】:

  • 当您处置一个实例时,您将无法再使用它 - 连接已关闭,它已准备好进行垃圾回收。为什么必须使用单个命令实例?我只是不明白你的问题尝试更好地解释。
  • this.Cmd.Dispose();当你给 dispose() 时会发生什么?
  • 您自己指定问题:您使用了一个MySqlCommand,而您应该使用两个。
  • @MahaSwetha :实际上在处理它之后什么都没有发生,甚至没有给出错误,我可以毫无问题地使用相同的实例。
  • @C.Evenhuis 是的,但我只能使用一个....有什么办法实际上我必须触发超过 3 个查询并且必须在单一事务中维护所有内容,以便如果有任何事情出错我可以回滚

标签: mysql vb.net


【解决方案1】:

要在同一个事务中执行多个命令,请确保将事务对象分别分配给每个命令:

Dim selectCmd As MySqlCommand = con.CreateCommand()
Dim insertCmd As MySqlCommand = con.CreateCommand()

selectCmd.CommandText = "SELECT ..."
insertCmd.CommandText = "INSERT ..."

Dim sqlTran As MySqlTransaction = con.BeginTransaction()
Try
  selectCmd.Transaction = sqlTran
  insertCmd.Transaction = sqlTran

  ...selectCmd.ExecuteScalar()...
  ...insertCmd.ExecuteNonQuery()...

  sqlTran.Commit()
Catch
  sqlTran.Rollback()
End Try

正如其他人所提到的,在您使用完Dispose() 对象(即IDisposable)后,它们通常是一个好主意。处理对象后,就不能再使用了。

【讨论】:

  • @C Evenhuis :好的,明白了...但是看看我的问题中的 for 循环我们应该怎么做???有什么建议???
【解决方案2】:

您可以使用 Using 关键字来自动处理对象。 我不知道VB,但我知道C#。 请把代码转成VB。

using(MySqlConnection con= new MySqlConnection("connectionString"))
{
    con.Open();
    using(MysqlTransaction trans=con.BeginTransaction())
    {
        try
        {
            //command to executive query
            using(MysqlCommand cmd= new MySqlCommand("query", con, trans))
            {
                cmd.Parameters.AddWithValue("@parameter1", parametervalue1);
                cmd.Parameters.AddWithValue("@parameter2", parametervalue2);
                cmd.ExecutenonQuery();
                cmd.Parameters.Clear();
            }
            //command to execute query
            using(MysqlCommand cmd= new MySqlCommand("query", con, trans))
            {
                cmd.Parameters.AddWithValue("@parameter1", parametervalue1);
                cmd.Parameters.AddWithValue("@parameter2", parametervalue2);
                cmd.ExecutenonQuery();
                cmd.Parameters.Clear();
            }
            //command to execute query
            using(MysqlCommand cmd= new MySqlCommand("query", con, trans))
            {
                cmd.Parameters.AddWithValue("@parameter1", parametervalue1);
                cmd.Parameters.AddWithValue("@parameter2", parametervalue2);
                cmd.ExecutenonQuery();
                cmd.Parameters.Clear();
            }
            trans.Commit();
        }
        catch(Exception ex)
        {
            trans.Rollback();
        }
    }
}

【讨论】:

  • 如果插入失败是为了连接而关闭的,回滚将不起作用,会产生异常,有没有其他方式给回滚?
  • 这是一个糟糕的解决方案 - c# 中的 'using' 语句会为您执行 try catch,如果发生任何不好的事情,则会调用 MySqlTransaction.cs.Dispose(),这会回滚事务跨度>
  • 马里奥。 MySqlTransaction.cs.Dispose() 真的回滚事务吗?如果那样的话,在捕获异常之后不需要 trans.Rollback() ,这将是最好的解决方案。对吗?
猜你喜欢
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 2012-05-22
  • 2019-05-29
  • 2011-10-01
相关资源
最近更新 更多