Xamarin上的Realm是否支持并发(非嵌套)写入事务?

时间:2016-06-29 16:10:03

标签: android multithreading xamarin xamarin.android realm

我在这样的调用上偶尔会遇到Realms.RealmInvalidTransactionException异常:

var realm = Realm.GetInstance;

using (var trans = realm.BeginWrite())
{
    var stopActualItem = realm.All<StopActualItemRealm>().Where(r => r.StopActualId == stopActualId).ToList().FirstOrDefault();

    if (stopActualItem == null)
    {
        stopActualItem = realm.CreateObject<StopActualItemRealm>();
    }

    // Code that updates the stopActualItem class would be here

    trans.Commit();
}

同时,后台线程中的代码也可以在另一个BeginWrite()事务中写入Realm数据库。尝试执行并发写入时,似乎抛出异常。每个线程都在调用Realm.GetInstance()。是否允许并发Realm写入事务,还是需要对它们进行排队?

我正在使用Realm v0.76.1和Xamarin.Android

1 个答案:

答案 0 :(得分:1)

是支持并发写入请求,并且我们的一个内部测试应用程序已被数十个不停写入的线程打乱。

Xamarin产品使用与Java其他Android用户大量测试的相同C ++核心引擎。

进一步exolain,有一整个deep dive into threading in Realm,但简短的版本是我们在整个数据库上有(快速)阻塞的MVCC。因此,在任何给定的时刻,只有一个线程处于写入状态,而其他写入则是同步和阻塞的。写入不会阻止任何读取。

我们当然可能有一个错误,非常感谢一个演示应用程序,看看我们是否可以复制,以及有关Android环境的详细信息。请log an issue了解更多详情

如果您需要将其保密,请发送电子邮件至help@realm.io。