【发布时间】:2015-03-09 06:43:38
【问题描述】:
我在以下场景中使用 SQLite 时遇到问题。
有两个线程在数据库上工作。
两个线程都必须在事务中插入消息。
如果说一个线程在插入 20k 行后提交,而其他线程尚未提交。
在输出中,我看到线程 2 插入的所有数据都已提交,直到线程 1 提交数据为止。
示例函数:
/// <summary>
/// Inserts list of messages in message table
/// </summary>
/// <param name="listMessages"></param>
/// <returns></returns>
public bool InsertMessages(IList<MessageBase> listMessages, bool commitTransaction)
{
bool success = false;
if (listMessages == null || listMessages.Count == 0)
return success;
DatabaseHelper.BeginTransaction(_sqlLiteConnection);
foreach (MessageBase message in listMessages)
{
using (var statement = _sqlLiteConnection.Prepare(_insertMessageQuery))
{
BindMessageData(message, statement);
SQLiteResult result = statement.Step();
success = result == SQLiteResult.DONE;
if (success)
{
Debug.WriteLine("Message inserted suucessfully,messageId:{0}, message:{1}", message.Id, message.Message);
}
else
{
Debug.WriteLine("Message failed,Result:{0}, message:{1}", result, message.Message);
}
}
}
if (commitTransaction)
{
Debug.WriteLine("Data committed");
DatabaseHelper.CommitTransaction(_sqlLiteConnection);
}
else
{
Debug.WriteLine("Data not committed");
}
return success;
}
有什么方法可以阻止线程 2 插入的提交事务?
【问题讨论】:
-
您是否打开了 2 个数据库连接,每个线程一个,且禁用了 shared_cache?
-
我为两个线程使用相同的数据库连接,并保持在整个应用程序中打开的单个数据库连接。
标签: multithreading sqlite transactions windows-phone-8.1