C# Sqlite原子操作

C# Sqlite原子操作,c#,sqlite,C#,Sqlite,我运行了5个应用程序,它们使用相同的sqlite数据库(每个应用程序都是不同的进程)。不幸的是,像GetEmptyPort这样的操作必须是原子的,以防止返回相同的值。现在我通过使用systemMutex实现了这一点,但我不喜欢这个解决方案。在纯sqlite中是否有任何内置的解决方案可以做到这一点 这是我的代码: private static Mutex DB_MUTEX = new Mutex(false, "FOO_DB_MUTEX"); private T OnMutexWork<T

我运行了5个应用程序,它们使用相同的
sqlite
数据库(每个应用程序都是不同的进程)。不幸的是,像
GetEmptyPort
这样的操作必须是原子的,以防止返回相同的值。现在我通过使用system
Mutex
实现了这一点,但我不喜欢这个解决方案。在纯sqlite中是否有任何内置的解决方案可以做到这一点

这是我的代码:

private static Mutex DB_MUTEX = new Mutex(false, "FOO_DB_MUTEX");

private T OnMutexWork<T>(Func<T> func)
{
    try
    {
        DB_MUTEX.WaitOne();
        return func.Invoke();
    }
    catch (Exception ex)
    {
        throw;
    }
    finally
    {
        DB_MUTEX.ReleaseMutex();
    }
}

private SQLiteConnection GetConnection()
{
    return new SQLiteConnection(databasePath);
}

private int GetEmptyPort(int min, int max)
{
    return OnMutexWork<int>(() =>
    {
        using (var conn = GetConnection())
        {
            var allPorts = conn.Table<Port>()
                    .ToList();

            for (int i = min; i <= max; i++)
            {
                if (!allPorts.Any(x => x.Value == i))
                {
                    var item = new Port() { Value = i};
                    conn.Insert(item);
                    return i;
                }
            }

            throw new Exception("Couldn't find empty port");
        }
    });
}
private static Mutex DB_Mutex=new Mutex(false,“FOO_DB_Mutex”);
私人T-OnMutexWork(Func-Func)
{
尝试
{
DB_MUTEX.WaitOne();
返回func.Invoke();
}
捕获(例外情况除外)
{
投掷;
}
最后
{
DB_MUTEX.ReleaseMutex();
}
}
私有SQLiteConnection GetConnection()
{
返回新的SQLiteConnection(databasePath);
}
私有int GetEmptyPort(int最小值,int最大值)
{
交工回报率(()=>
{
使用(var conn=GetConnection())
{
var allPorts=conn.Table()
.ToList();
对于(int i=min;i x.Value==i))
{
var item=new Port(){Value=i};
连接插页(项目);
返回i;
}
}
抛出新异常(“找不到空端口”);
}
});
}
我尝试了@Shawn的建议:

private int GetEmptyPort(int min, int max)
{
    using (var conn = GetConnection())
    {
        conn.RunInTransaction(() =>
        {
            var allPorts = conn.Table<Port>()
                .ToList();

            for (int i = min; i <= max; i++)
            {
                if (!allPorts.Any(x => x.Value == i))
                {
                    var item = new Port() { Value = i};
                    conn.Insert(item);
                    return i;
                }
            }
        });

        throw new Exception("Couldn't find empty port");
    }
}
private int GetEmptyPort(int-min,int-max)
{
使用(var conn=GetConnection())
{
连接运行内部事务(()=>
{
var allPorts=conn.Table()
.ToList();
对于(int i=min;i x.Value==i))
{
var item=new Port(){Value=i};
连接插页(项目);
返回i;
}
}
});
抛出新异常(“找不到空端口”);
}
}

但是当从不同的连接访问数据库时,我得到了
SQLite.SQLiteException:“Busy”
错误。

请添加问题的更详细描述。独占事务@TimBiegeleisen哪一部分你不懂?@Shawn你能看看我的交易记录吗?我编辑了上面的帖子