为啥 TransactionScope 不能与 Sqlite 一起使用?

Posted

技术标签:

【中文标题】为啥 TransactionScope 不能与 Sqlite 一起使用?【英文标题】:Why Is TransactionScope Not Working With Sqlite?为什么 TransactionScope 不能与 Sqlite 一起使用? 【发布时间】:2021-06-14 06:38:30 【问题描述】:

总之,下面的代码创建一个新表,启动一个 TransactionScope,向新表中插入一行,退出 TransactionScope 而不在 TransactionScope 上调用 Complete,然后获取新表中的行数。我希望行数为零,因为当 TransactionScope 在没有调用 Complete 的情况下退出时,插入应该已经回滚。事实上,代码报告的行数为 1。当我针对 Sql Server 数据库运行代码时,我确实得到了预期的零行数,所以我认为代码过程是正确的。

我正在使用 v5.0.4 的 Microsoft.Data.Sqlite NuGet 包并针对 .NET Framework v4.8 进行编码。

为什么对Sqlite数据库执行代码时插入没有回滚?

class Program

    static void Main(string[] args)
    
        string dbPath = @".\MyDb.db";

        using (SqliteConnection connection = new SqliteConnection($"Data Source = dbPath"))
        
            connection.Open();
            using (SqliteCommand command = connection.CreateCommand())
            
                command.CommandText = @"DROP TABLE IF EXISTS TestTable;CREATE TABLE TestTable (TestCol TEXT);";
                command.ExecuteNonQuery();
            
        

        using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
        
            using (SqliteConnection connection = new SqliteConnection($"Data Source = dbPath"))
            
                connection.Open();
                using (SqliteCommand command = connection.CreateCommand())
                
                    command.CommandText = "INSERT INTO TestTable(TestCol) VALUES('Row 1')";
                    command.ExecuteNonQuery();
                
            
            //ts.Complete();
        

        using (SqliteConnection connection = new SqliteConnection($"Data Source = dbPath"))
        
            connection.Open();
            using (SqliteCommand command = connection.CreateCommand())
            
                command.CommandText = @"SELECT COUNT(*) FROM TestTable;";
                Console.WriteLine($"Row count is command.ExecuteScalar()");
            
        

        Console.Read();
    

【问题讨论】:

【参考方案1】:

经过进一步研究,我相信答案是——在撰写本文时,Microsoft.Data.Sqlite 不支持 TransactionScope。这是打开的 GitHub 项目:

https://github.com/dotnet/efcore/issues/13825

【讨论】:

以上是关于为啥 TransactionScope 不能与 Sqlite 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

TransactionScope不能与linux上的async / await方法一起使用

TransactionScope 事务 = new TransactionScope() VS TransactionScope s = context.Connection.BeginTransac

小巧玲珑和交易范围?

嵌套 TransactionScope 在测试中失败

TransactionScope 与 SQLite 内存数据库和 NHibernate

将 TransactionScope 与实体框架 6 一起使用