我需要创建一个MySQL表并在Mono中填充一些数据。我使用以下代码来执行此操作:
public class TestModel
{
protected IDbConnection dbcon;
public TestModel()
{
string connectionString = "Server=localhost;"
+ "Database=cikdata;"
+ "User ID=root;"
+ "Password=password;"
+ "Pooling=false";
dbcon = new MySqlConnection(connectionString);
dbcon.Open();
IDbCommand dbcmd = dbcon.CreateCommand();
// Create table
dbcmd.CommandText = "CREATE TABLE employee (firstname varchar(32), lastname varchar(32))";
dbcmd.ExecuteScalar();
// fill this table with some data
dbcmd.CommandText = "SELECT firstname, lastname FROM employee";
IDataReader reader = dbcmd.ExecuteReader();
while(reader.Read()) {
string FirstName = (string) reader["firstname"];
string LastName = (string) reader["lastname"];
Console.WriteLine("Name: " + FirstName + " " + LastName);
}
// clean up
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
}
~TestModel()
{
dbcon.Close();
dbcon = null;
}
}
我已经看过许多如何在Mono中使用MySQL的示例,其中使用了IDbTransaction
。上面的代码在没有任何事务对象的情况下工作。我真的需要在我的代码中使用事务对象(和IDbTransaction.Commit
)吗?
很抱歉问这样一个新手问题。我主要是一个C ++ / PHP开发人员,我对C#和Mono的经验很少。
答案 0 :(得分:3)
您绝对不应该将该代码包含在事务中。如果你这样做,你只会混淆自己或其他读者的代码。
在这种情况下的原因是CREATE TABLE
在MySQL中导致implicit commit所以在你的第一个命令(CREATE TABLE
)之后你已经提交了你的事务,其余的命令将会无论如何都发生在交易之外并且rollback或commit将不会执行任何操作。
如果您尝试回滚CREATE TABLE
mysql [localhost] {msandbox} (test) > start transaction;
Query OK, 0 rows affected (0.01 sec)
mysql [localhost] {msandbox} (test) > create table transtest(id int);
Query OK, 0 rows affected (0.32 sec)
mysql [localhost] {msandbox} (test) > rollback;
Query OK, 0 rows affected (0.02 sec)
mysql [localhost] {msandbox} (test) > select * from transtest;
Empty set (0.00 sec)
注意表格是如何存在的......
答案 1 :(得分:1)
当您以一组单独的sql命令运行一个操作时,事务是一个好习惯。
在这种情况下,它取决于您是否希望在填充代码失败时回滚create table。
所以你可以按照以下步骤来看待它。
Start a transaction
Create the table
Insert some data
Commit transaction
如果你没有显式事务,那么就会有一个显式事务,所以如果你将一些insert语句附加到create table语句并调用ExcuteScalar,你就会得到相同的效果。
当你想要什么都不改变时,如果它的任何部分失败,基本上使用启动事务/提交事务。
或者,如果您希望在批量购买时不被任何其他用户更改。正在进行操作。