如何解决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 举报,一经查实,本站将立刻删除。