虽然我不回滚我的事务,但SQLite事务没有成功?

时间:2011-09-07 13:01:27

标签: c# sqlite transactions commit rollback

创建连接+交易:

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()){...}

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

因为事务有隐式回滚。提交必须明确。

连接最终将由运行时关闭。