gpt4 book ai didi

.net - 在单线程上使用事务时 sqlite 和 SubSonic 的锁定问题

转载 作者:行者123 更新时间:2023-12-02 08:52:50 25 4
gpt4 key购买 nike

我在尝试使用 SubSonic 和 SQLite 事务时遇到锁定异常。我从单个线程使用它,并且没有其他进程访问我的数据库,所以我真的没想到会出现任何此类问题。

如果我编写如下代码,我会在循环内第二次调用 Save() 时遇到异常 - 因此第三次调用 Save() 时会出现异常。

       using (TransactionScope ts = new TransactionScope())
{
using (SharedDbConnectionScope sharedConnectinScope = new SharedDbConnectionScope())
{
SomeDALObject x = new SomeDALObject()
x.Property1 = "blah";
x.Property2 = "blah blah";
x.Save();

foreach (KeyValuePair<string, string> attribute in attributes)
{
AnotherDALObject y = new AnotherDALObject()
y.Property1 = attribute.Key
y.Property2 = attribute.Value

y.Save(); // this is where the exception is raised, on the 2nd time through this loop
}
}
}

如果我有如上所述的 using() 语句,或者如果我只有 using (TransactionScope ts = new TransactionScope()) 那么我会得到一个 System.Data.SQLite.SQLiteException 带有消息

The database file is locked

database is locked

堆栈跟踪是:

   at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
at System.Data.SQLite.SQLiteTransaction..ctor(SQLiteConnection connection, Boolean deferredLock)
at System.Data.SQLite.SQLiteConnection.BeginDbTransaction(IsolationLevel isolationLevel)
at System.Data.SQLite.SQLiteConnection.BeginTransaction()
at System.Data.SQLite.SQLiteEnlistment..ctor(SQLiteConnection cnn, Transaction scope)
at System.Data.SQLite.SQLiteConnection.EnlistTransaction(Transaction transaction)
at System.Data.SQLite.SQLiteConnection.Open()
at SubSonic.SQLiteDataProvider.CreateConnection(String newConnectionString)
at SubSonic.SQLiteDataProvider.CreateConnection()
at SubSonic.SQLiteDataProvider.ExecuteScalar(QueryCommand qry)
at SubSonic.DataService.ExecuteScalar(QueryCommand cmd)
at SubSonic.ActiveRecord`1.Save(String userName)
at SubSonic.ActiveRecord`1.Save()
at (my line of code above).

如果我以相反的方式嵌套了 using 语句,并且 SharedDbConnectionScope 位于外部,那么我会收到 TransactionException ,其中包含消息“该操作对于事务状态无效”。堆栈跟踪是:

at System.Transactions.TransactionState.EnlistVolatile(InternalTransaction tx, IEnlistmentNotification enlistmentNotification, EnlistmentOptions enlistmentOptions, Transaction atomicTransaction)
at System.Transactions.Transaction.EnlistVolatile(IEnlistmentNotification enlistmentNotification, EnlistmentOptions enlistmentOptions)
at System.Data.SQLite.SQLiteEnlistment..ctor(SQLiteConnection cnn, Transaction scope)
at System.Data.SQLite.SQLiteConnection.EnlistTransaction(Transaction transaction)
at System.Data.SQLite.SQLiteConnection.Open()
at SubSonic.SQLiteDataProvider.CreateConnection(String newConnectionString)
at SubSonic.SQLiteDataProvider.CreateConnection()
at SubSonic.SQLiteDataProvider.ExecuteScalar(QueryCommand qry)
at SubSonic.DataService.ExecuteScalar(QueryCommand cmd)
at SubSonic.ActiveRecord`1.Save(String userName)
at SubSonic.ActiveRecord`1.Save()
at (my line of code above)

内部异常是“事务超时”

我生成的 DAL 类中没有任何自定义代码,或者我能想到的任何其他聪明的东西会导致此问题。

还有其他人遇到过这样的交易问题吗?或者有人可以建议我从哪里开始寻找问题吗?

谢谢!

更新:我注意到版本 1.0.61-65 的发行说明中提到了与事务相关的内容(例如 here ),因此更新 SubSonic 以使用最新版本的 .Net 数据提供程序可能会解决一些问题这些问题...

最佳答案

在为 subsonic 2.x 修改 sqlite 提供程序时,我基于现有的 subsonic sqlserver 测试创建了一整套单元测试。 (这些测试也用修订后的代码进行了检查。)唯一失败的测试是与事务相关的测试(也许还有迁移测试)。正如您所看到的,“数据库文件已锁定”错误消息。 Subsonic 主要是为 sql server 编写的,它不像 SQLite 那样进行文件级锁定,因此有些功能不起作用;需要重写才能更好地处理这个问题。

我从来没有像你一样使用过 TransactionScope。我像这样进行亚音速 2.2 事务,到目前为止 SQLite 提供程序没有出现任何问题。我可以确认,如果处理多行,您需要使用 SQLite 事务,否则速度非常慢。

public void DeleteStuff(List<Stuff> piaRemoves)
{
QueryCommandCollection qcc = new QueryCommandCollection();

foreach(Stuff item in piaRemoves)
{
Query qry1 = new Query(Stuff.Schema);
qry1.QueryType = QueryType.Delete;
qry1.AddWhere(Stuff.Columns.ItemID, item.ItemID);
qry1.AddWhere(Stuff.Columns.ColumnID, item.ColumnID);
qry1.AddWhere(Stuff.Columns.ParentID, item.ParentID);
QueryCommand cmd = qry1.BuildDeleteCommand();
qcc.Add(cmd);
}
DataService.ExecuteTransaction(qcc);
}

关于.net - 在单线程上使用事务时 sqlite 和 SubSonic 的锁定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2291364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com