我自己调查过:
我创建了一个示例 SQLite 数据库c:\123.db
,其中一个表Categories
包含两个字段:ID
(uniqueidentifier) 和Name
(nvarchar)。
System.Data.SQLite
然后我编写了一些多线程代码来模拟对数据库的多次写入访问(如果您使用此代码,请不要忘记添加对您的项目的引用):
using System;
using System.Data.SQLite;
using System.Threading.Tasks;
namespace SQLiteTest
{
class Program
{
static void Main(string[] args)
{
var tasks = new Task[100];
for (int i = 0; i < 100; i++)
{
tasks[i] = new Task(new Program().WriteToDB);
tasks[i].Start();
}
foreach (var task in tasks)
task.Wait();
}
public void WriteToDB()
{
try
{
using (SQLiteConnection myconnection = new SQLiteConnection(@"Data Source=c:\123.db"))
{
myconnection.Open();
using (SQLiteTransaction mytransaction = myconnection.BeginTransaction())
{
using (SQLiteCommand mycommand = new SQLiteCommand(myconnection))
{
Guid id = Guid.NewGuid();
mycommand.CommandText = "INSERT INTO Categories(ID, Name) VALUES ('" + id.ToString() + "', '111')";
mycommand.ExecuteNonQuery();
mycommand.CommandText = "UPDATE Categories SET Name='222' WHERE ID='" + id.ToString() + "'";
mycommand.ExecuteNonQuery();
mycommand.CommandText = "DELETE FROM Categories WHERE ID='" + id.ToString() + "'";
mycommand.ExecuteNonQuery();
}
mytransaction.Commit();
}
}
}
catch (SQLiteException ex)
{
if (ex.ReturnCode == SQLiteErrorCode.Busy)
Console.WriteLine("Database is locked by another process!");
}
}
}
}
我的 Core2Duo E7500 上的结果是从未引发异常!
看起来 SQLite 已经针对我的需要进行了足够的优化(锁定/解锁非常快,通常只需要几毫秒,正如SQLite 常见问题解答告诉我们的那样) - 太棒了!
请注意,不需要为 an 检索整数 ErrorCode SQLiteException
- 您可以改用特殊的枚举ReturnCode
字段。此处描述了所有代码。
希望这些信息对某人有所帮助。