C# Sqlite原子操作
我运行了5个应用程序,它们使用相同的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
sqlite
数据库(每个应用程序都是不同的进程)。不幸的是,像GetEmptyPort
这样的操作必须是原子的,以防止返回相同的值。现在我通过使用systemMutex
实现了这一点,但我不喜欢这个解决方案。在纯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你能看看我的交易记录吗?我编辑了上面的帖子