簡體   English   中英

使用 Begintransaction、多個存儲庫、SQLite、UnitOfWork 和 Dapper 時出現數據庫鎖定錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM