持久化帮助期间的Nhibernate事务级别

持久化帮助期间的Nhibernate事务级别,nhibernate,transactions,Nhibernate,Transactions,我有个问题。假设您有一个要保存在事务中的对象,该对象具有其他对象的集合等,因此它是一个更“复杂”的对象 无论如何,有时我们会像那样保存对象,但与此同时,我们使用另一个线程偶尔读取所述数据并将其同步到我们的中央服务器。但是,我们注意到,在某些情况下,对象在没有所有集合对象的情况下被同步 由于这种情况每隔一段时间才会发生一次,我们认为这可能是事务隔离级别。可能同步线程在事务持久化所有对象之前读取数据,因此只读取所需数据的一半并将其发送过来 因为我们都知道客户机的数据一直都在保存,只是有时候发送给我们

我有个问题。假设您有一个要保存在事务中的对象,该对象具有其他对象的集合等,因此它是一个更“复杂”的对象

无论如何,有时我们会像那样保存对象,但与此同时,我们使用另一个线程偶尔读取所述数据并将其同步到我们的中央服务器。但是,我们注意到,在某些情况下,对象在没有所有集合对象的情况下被同步

由于这种情况每隔一段时间才会发生一次,我们认为这可能是事务隔离级别。可能同步线程在事务持久化所有对象之前读取数据,因此只读取所需数据的一半并将其发送过来

因为我们都知道客户机的数据一直都在保存,只是有时候发送给我们的数据没有标记

所以我们想要某种锁,我想,我对这些锁一无所知。我们应该用哪一个

在本例中,没有外部资源用于数据库,因为它是客户端客户上的WPF应用程序

任何帮助都将不胜感激

致以最良好的祝愿,
E.

每个数据库都支持一套标准。这些都是为了在一定程度上防止您读取在另一个事务中修改的数据。我建议你先读一下这些隔离水平的含义

在您的特定情况下,我建议对于正在读取数据的事务,您至少使用ReadCommitted的隔离级别。在代码中,这将如下所示:

using (var transactionScope = new TransactionScope(TransactionScopeOption.Required,
    new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
{
    // Read the data you want from the database.
    ...
    transactionScope.Complete();
    // Return the data.
}
使用with可防止读取其他事务尚未提交的数据


将数据写入数据库的代码也应该放在一个事务中。只要您只在该事务中写入数据,该事务的隔离级别就无关紧要。这保证了更新的原子性:要么所有更新都成功,要么没有更新。这还可以防止另一个事务读取部分更新。

非常感谢mate!正是我需要知道的。:)