MySQL mysql事务(提交和回滚)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14252560/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
mysql transaction (commit and rollback)
提问by neerajMAX
below is the code i am using for MySqlTransaction and it is running perfectly.... but problem is as i am using single instance of mysqlcommand i have to use unique PARAMETER in it. which is ruining my query. is there any other way around to do....
下面是我用于 MySqlTransaction 的代码,它运行完美......但问题是我使用的是 mysqlcommand 的单个实例,我必须在其中使用唯一的 PARAMETER。这破坏了我的查询。有没有其他方法可以做....
i tried to dispose cmd after each query but of no use.. :(
我试图在每次查询后处理 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
i actually want to fire more then 4 queries in single transaction so that if anything go wrong i can rollback it...
我实际上想在单个事务中触发 4 个以上的查询,以便如果出现任何问题,我可以回滚它...
if any onebody have any other method of it kindly share the concept wid me...
如果有人有任何其他方法,请与我分享这个概念......
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
回答by C.Evenhuis
To execute multiple commands within the same transaction, ensure that you assign the transaction object to each command individually:
要在同一个事务中执行多个命令,请确保将事务对象分别分配给每个命令:
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
As others have mentioned, it is generally a good idea to Dispose()
objects (that are IDisposable
) as soon as you're done working with them. After disposing objects, they can no longer be used.
正如其他人所提到的,一旦您完成对Dispose()
对象的处理,IDisposable
就立即处理它们通常是一个好主意。处置对象后,它们将无法再使用。
回答by Surendra Chauhan
You can use Using keyword for auto dispose objects. i don't know VB but I know C#. Please convert the code into VB.
您可以将 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();
}
}
}