创建连接+交易:
public SQLiteTransaction BeginTransaction()
{
var con = new SQLiteConnection(@"Data Source=A:\TransactionScopeTest\TransactionTest.db;Foreign Keys=ON");
con.Open();
var trans = con.BeginTransaction();
return trans;
}
使用相同的主键值执行2个sqlite插入以引发异常
[TestMethod]
public void TestMethod1()
{
using (var trans = BeginTransaction())
{
try
{
SQLiteConnection con = trans.Connection;
SQLiteCommand cmd1 = con.CreateCommand();
cmd1.CommandText = "INSERT INTO TEST(Name) VALUES('John')";
cmd1.ExecuteNonQuery();
SQLiteCommand cmd2 = con.CreateCommand();
cmd2.CommandText = "INSERT INTO TEST(Name) VALUES('John')";
cmd2.ExecuteNonQuery();
trans.Commit();
}
catch (Exception)
{
trans.Rollback();
throw;
}
}
}
我使用SQLite的最佳做法是为每个执行的sql命令使用SQLiteTransaction类。 需要在数据提供者方法之间共享来自事务的连接。
我现在问你多个问题:
1。)当由于插入相同的主键“John”而发生SQLiteException时,没有插入任何“John”值。没关系,因为我使用了一个事务,必须执行.Commit()。困扰我的是为什么它没有任何区别,或者我没有在catch-block中使用trans.Rollback()。
2.)我正在使用“using(resource)” - 语句,那么如果事务成功/提交到连接状态会发生什么?它会被关闭吗?只关心我不使用`using(var trans = new SQLiteTransaction()){...}
答案 0 :(得分:3)
答案 1 :(得分:1)
因为事务有隐式回滚。提交必须明确。
连接最终将由运行时关闭。