我有一个问题。想象一下,你有一个你想要在事务中保存的对象,该对象具有其他对象的集合等,因此它是一个更“复杂”的对象。
无论如何,有时我们会保存这样的对象,但与此同时,我们使用另一个偶尔读取所述数据并将它们同步到我们的中央服务器的线程。但是,我们注意到在某些情况下对象在没有所有集合对象的情况下同步的问题。
由于这种情况每隔一段时间才会发生,我们认为它可能是事务隔离级别。也许同步线程在事务完成之前读取数据,持久化所有对象,因此只读取所需数据的一半,并将其发送出来。
因为我们都知道客户数据全部都是保存的,所以有时它会在发送给我们的时候没有标记。
所以我想我想要某种锁,我只是对这些锁一无所知。我们应该使用哪一个?
在这种情况下,没有外部资源用于数据库,因为它是客户端客户的WPF应用程序。
任何帮助将不胜感激!
祝你好运, 即
答案 0 :(得分:1)
每个数据库都支持一组标准isolation levels。这些都是为了防止您在某个级别上读取在另一个事务中修改的数据。我建议你先阅读这些isoloation等级的含义。
在您的具体情况下,我建议对于正在读取数据的事务,至少使用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.
}
将TransactionScope
与IsolationLevel.ReadCommitted
一起使用可以防止您读取其他交易尚未提交的数据。
将数据写入数据库的代码也应放在一个事务中。只要您只在该事务中写入数据,该事务的隔离级别就无关紧要了。这可以保证更新的原子性:要么所有更新都成功,要么都不成功。这也可以防止另一个事务读取部分更新。