我想知道使用.net客户端给出以下场景会发生什么.
using (IDocumentSession session = documentStore.OpenSession())
{
thingToUpdate = session.Load<TUpdateThing>(id);
// Modify thingToUpdate here
// ** Someplace else the object is updated and saved. **
session.SaveChanges(); // What happens here?
}
Run Code Online (Sandbox Code Playgroud)
这会根据etag的变化自动抛出错误,还是会关闭并覆盖其他人所做的更改?
我已经在http api上看到了一些关于这个的东西:http: //ravendb.net/docs/http-api/http-api-comcurrency
你所说的是乐观并发.如果你想使用它,你设置
session.Advanced.UseOptimisticConcurrency = true;
Run Code Online (Sandbox Code Playgroud)
默认情况下,它未设置.
这是一个通过测试,证明了这一点:
public class ConcurrentUpdates : LocalClientTest
{
[Fact]
public void ConcurrentUpdatesWillThrowAConcurrencyException()
{
using (var store = NewDocumentStore())
{
var originalPost = new Post { Text = "Nothing yet" };
using (var s = store.OpenSession())
{
s.Store(originalPost);
s.SaveChanges();
}
using (var session1 = store.OpenSession())
using (var session2 = store.OpenSession())
{
session1.Advanced.UseOptimisticConcurrency = true;
session2.Advanced.UseOptimisticConcurrency = true;
var post1 = session1.Load<Post>(originalPost.Id);
var post2 = session2.Load<Post>(originalPost.Id);
post1.Text = "First change";
post2.Text = "Second change";
session1.SaveChanges();
// Saving the second text will throw a concurrency exception
Assert.Throws<ConcurrencyException>(() => session2.SaveChanges());
}
using (var s = store.OpenSession())
{
Assert.Equal("First change", s.Load<Post>(originalPost.Id).Text);
}
}
}
public class Post
{
public string Id { get; set; }
public string Text { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
891 次 |
| 最近记录: |