[英]Do I need to use Transaction objects with MySQL
我需要創建一個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;
}
}
我已經看到很多如何在使用IDbTransaction
Mono中使用MySQL的示例。 上面的代碼在沒有任何事務對象的情況下工作。 我真的需要在我的代碼中使用事務對象(和IDbTransaction.Commit
)嗎?
很抱歉問這樣一個新手問題。 我主要是一個C ++ / PHP開發人員,我對C#和Mono的經驗很少。
您絕對不應該將該代碼包含在事務中。 如果你這樣做,你只會混淆自己或其他讀者的代碼。
在這種情況下,原因是CREATE TABLE
在MySQL中導致隱式提交 ,因此在您的第一個命令( CREATE TABLE
)之后,您已經提交了您的事務,其余命令將在事務之外發生。 並且回滾或提交將不會做任何事情。
如果您嘗試回滾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)
請注意表格仍然存在...
當您以一組單獨的sql命令運行一個操作時,事務是一個好習慣。
在這種情況下,它取決於您是否希望在填充代碼失敗時回滾create table。
因此,您可以按以下步驟查看它。
Start a transaction
Create the table
Insert some data
Commit transaction
如果你沒有顯式事務,那么就有一個顯式事務,所以如果你將一些insert語句附加到create table語句並調用ExcuteScalar,你會得到相同的效果。
當你想要什么都不改變時,如果它的任何部分失敗,基本上使用啟動事務/提交事務。
或者,如果您在執行“批量”操作時不希望任何其他用戶更改任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.