![](/img/trans.png)
[英]Does SQLiteConnection.BeginTransaction retry when database is locked?
[英]Database locked error when using Begintransaction, multiple repositories, SQLite, UnitOfWork and Dapper
我正在嘗試使用 SQLite 和 Dapper 實現事務,但出現“數據庫已鎖定”錯誤。
我正在使用此處建議的 UnitOfWork 模式。
這是代碼:
Controller.cs:
public async Task MyMethodAsync()
{
//**injecting unitOfWork but this is the implementation**
var unitOfWork = new UnitOfWork(new SQLiteConnection($"Data Source=TestDb;Mode=Memory;Cache=Shared"));
using (var connection = unitOfWork.Connection)
{
connection.Open();
unitOfWork.Begin();
var myFirstRepository = new MyFirstRepository(unitOfWork);
var mySecondRepository = new MySecondRepository(unitOfWork);
try
{
myFirstRepository.CreateStuff(); //Here it throws the exception "database is locked"
mySecondRepository.CreateOtherStuff();
unitOfWork.Commit();
}
catch(Exception e)
unitOfWork.Rollback();
throw;
}
}
}
MyFirstRepository.cs:
public class MyFirstRepository
{
private IUnitOfWork _unitOfWork;
public MyFirstRepository(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public void CreateStuff()
{
using (var connection = _unitOfWork.Connection)
{
connection.Open();
await connection.ExecuteAsync("INSERT INTO ...", param).ConfigureAwait(false);
}
}
}
MySecondRepository.cs:
類似 MyFirstRepository.cs 的實現。
有誰知道我在這里缺少什么?
看起來您打開了兩次連接 - 一次是在MyMethodAsync
中,一次是在MyFirstRepository.CreateStuff
中。 我在 SQLiteConnection class 的文檔中沒有看到任何關於如果您嘗試打開連接兩次會發生什么,但也許這會導致您出現問題? 我還注意到,在您鏈接的有關 UnitOfWork 的帖子中, connection.Open()
也只被調用一次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.