SQlite / Firebird:它们中的任何一个都支持多个并发写访问吗?

问题:我目前将ASP.net应用程序数据存储在XML文件中。

现在问题是我有异步操作,这意味着我遇到了对XML文件进行同时写访问的问题……

现在,我正在考虑转向嵌入式数据库来解决这个问题。 我正在考虑使用SQlite和嵌入式Firebird。

但是我不确定SQlite或Firebird是否可以处理多个并发写访问。
我当然不希望再次遇到同样的问题。
有人知道吗?
SQlite当然更为人所知,但哪一个更好 – SQlite还是Firebird? 我倾向于说Firebird,但我真的不知道。

请不要MS-Access或MS-SQL-express建议,我是一个理智的人。

我会选择Firebird有很多原因,对此也是如此

虽然它是事务性的,但SQLite不支持并发事务,因此如果您的嵌入式应用程序需要两个或更多连接,则必须对它们进行序列化。 嵌入式Firebird数据库很容易升级到完全共享的数据库 – 只需更改共享库即可。

也许你也可以查看这个

可以将SQLITE配置为在大多数情况下正常处理同时写入。 发生的情况是,当一个线程或进程开始写入db时,文件被锁定。 当尝试第二次写入并遇到锁定时,它会在再次尝试写入之前暂停一段时间,直到成功或超时。 超时是可配置的,但除非启用该选项,否则所有这些都会在没有应用程序代码执行任何特殊操作的情况下发生,如下所示:

// set SQLite to wait and retry for up to 100ms if database locked sqlite3_busy_timeout( db, 100 ); 

所有这些都很好,没有任何困难,除了两种情况:

  1. 如果一个应用程序在一个事务中执行了大量的写操作(例如一千个插入操作),那么数据库将被锁定很长一段时间并且可能导致任何其他尝试编写的应用程序出现问题。 解决方案是将大量写入分解为单独的事务,以便其他应用程序可以访问数据库。

  2. 如果数据库由在不同计算机上运行的不同进程共享,则共享网络挂载磁盘。 许多操作系统在网络安装的磁盘中存在错误,导致文件锁定不可靠。 对此没有答案。 如果需要在网络安装的磁盘上共享数据库,则需要另一个数据库引擎,如MySQL。

我对Firebird没有任何经验。 多年来,我在许多应用程序中都使用过SQLITE这样的情况。

您是否使用SQLite API for SQL支持查看Berkeley DB?

听起来像SQLite会很合适。 我们在许多生产应用程序中使用SQLite,它支持实际上,它更喜欢在处理并发方面有很长一段路的事务。

事务性sqlite? 在C#中

我会从ravenspoint上面的列表中添加#3:如果你有一个大的呼叫中心或订单处理中心,比如说,几十人可能同时点击SAVE按钮,即使每个人都在更新或插入只有一条记录,您可以使用忙碌超时方法遇到问题。

对于场景#3,可以序列化的真正SQL引擎是理想的; 不太理想但可维护的是可以对共享文件进行字节范围记录锁定的dbms。 但请注意,即使是字节范围的记录锁定也不适合大量的并发写入,因为新记录被附加到文件的末尾,就像货运列车末端的守车一样,因此多个进程正在尝试同时在同一字节范围内设置锁定。 另一方面, 与散列密钥稀疏文件方法相结合的字节范围记录锁定方案(例如,用于LAN的旧的Revelation / OpenInsight数据库)将远远优于此方案的ISAM。