微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLite 事务回滚与内存数据库不同

如何解决SQLite 事务回滚与内存数据库不同

我有一个 C# 应用程序单元测试,当使用基于文件sqlite 数据库和内存数据库时,它的行为会有所不同。

当我在单元测试中使用内存数据库运行此代码时,我在回滚后剩余 1 条记录。切换到基于文件数据库,我得到 0 条记录。我总是希望整个事务回滚并且数据库中存在零记录。有没有人明白有什么不同?

using System;
using System.Data.sqlite;

namespace DemoTransaction
{
    class Program
    {
        static void Main(string[] args)
        {
            string conString1 = @"Data Source=:memory:;Version=3;Pooling=True;Max Pool Size=100;foreign keys=true;";
            string conString2 = @"Data Source=C:\my_database.sqlite;Version=3;Pooling=True;Max Pool Size=100;foreign keys=true;";

            using (sqliteConnection dbCon = new sqliteConnection(conString1))
            {
                dbCon.open();

                using (sqliteCommand dbCom = new sqliteCommand("CREATE TABLE myTable (col1 INT NOT NULL PRIMARY KEY)",dbCon))
                {
                    dbCom.ExecuteNonQuery();
                }

                using (sqliteCommand dbCom = new sqliteCommand("CREATE TABLE myChild (col1 INT NOT NULL PRIMARY KEY,col2 INT NOT NULL REFERENCES myTable(col1))",dbCon))
                {
                    dbCom.ExecuteNonQuery();
                }

                sqliteTransaction dbTrans = dbCon.BeginTransaction();

                try
                {
                    using (sqliteCommand dbCom = new sqliteCommand("INSERT INTO myTable (col1) VALUES (1)",dbTrans.Connection,dbTrans))
                    {
                        // Successful query
                        dbCom.ExecuteNonQuery();
                    }

                    using (sqliteCommand dbCom = new sqliteCommand("INSERT INTO myChild (col1,col2) VALUES (1,NULL)",dbTrans))
                    {
                        // Intentionally bad query
                        dbCom.ExecuteNonQuery();
                    }

                    dbTrans.Commit();
                }
                catch (Exception ex)
                {
                    using (sqliteCommand dbCom = new sqliteCommand("SELECT Count(*) FROM myTable",dbCon))
                    {
                        Console.WriteLine(string.Format("Records before rollback: {0}",dbCom.ExecuteScalar()));
                    }

                    dbTrans.Rollback();

                    using (sqliteCommand dbCom = new sqliteCommand("SELECT Count(*) FROM myTable",dbCon))
                    {
                        Console.WriteLine(string.Format("Records after rollback: {0}",dbCom.ExecuteScalar()));
                    }
                }
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。