我在这样的调用上偶尔会遇到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
答案 0 :(得分:1)
是支持并发写入请求,并且我们的一个内部测试应用程序已被数十个不停写入的线程打乱。
Xamarin产品使用与Java其他Android用户大量测试的相同C ++核心引擎。
进一步exolain,有一整个deep dive into threading in Realm,但简短的版本是我们在整个数据库上有(快速)阻塞的MVCC。因此,在任何给定的时刻,只有一个线程处于写入状态,而其他写入则是同步和阻塞的。写入不会阻止任何读取。
我们当然可能有一个错误,非常感谢一个演示应用程序,看看我们是否可以复制,以及有关Android环境的详细信息。请log an issue了解更多详情
如果您需要将其保密,请发送电子邮件至help@realm.io。