SQLite的“数据库已锁定”

时间:2018-10-09 13:19:02

标签: sqlite entity-framework-6 mutex

即使使用互斥锁来控制对数据库访问的访问,我也无法摆脱“数据库已锁定”错误。

这是一个异步引发的事件处理程序:

    void driver_Transaccion(object sender, AttendanceReader.MarcacionEventArgs e)
    {
        if (_transaccion != null)
        {
            try
            {
                using (GlobalMutex.GetMutex())
                {
                    using (var db = new DataWare.monitorEntities())
                    {
                          /* some instructions */
                          /* ..... */
                          db.SaveChanges(); /* A database lock occurs here */
                    }
                }
             }
             catch (Exception ex)
             {
                ErrorLog.Save(ex);
             }
        }
    }

GlobalMutex.GetMutex()的定义方式如下:

public class GlobalMutex : IDisposable
{
    private Mutex _mutex;
    private bool _acquired;

    public GlobalMutex()
    {
        _mutex = new Mutex(false, "RELOJ_ELO_20181004");
        _acquired = _mutex.WaitOne();
    }

    public static IDisposable GetMutex()
    {
        return new GlobalMutex();
    }

    public void Dispose()
    {
        if (_acquired)
            _mutex.ReleaseMutex();
        _mutex.Dispose();
        _mutex = null;
    }
}

另一方面,还有另一个应用程序也可以写入数据库。

该外部应用程序以相同的方式捕获互斥体。

也许db.SaveChanges在其他进程尝试写入数据库文件之前没有关闭数据库文件。 SQLite数据库这样做很慢吗?有解决这个问题的有效方法吗?

问候 海梅

0 个答案:

没有答案