CAS机制
除了核心函数外,还有一个特殊函数叫做CAS (compare and swap). CAS提供了一个校验合,让多个客户端在同时更新文档时避免产生冲突。
例如,考虑如下场景:
- 客户端A获取到文档Martin的值
- 客户端B也获取到文档Martin的值
- 客户端A修改文档,并更新到数据库
- 客户端B也修改文档,并更新到数据库
在上述场景里,客户端B的修改会覆盖掉A修改的值。
为了解决这种情况,可以使用cas()函数。它要求提供从数据库里返回的唯一的CAS值。CAS值在文档更新时,每次都会改变,即使文档更新后的内容不变。将更新发送到服务器时,假如客户端提供的CAS值与服务器里当前存储的CAS不匹配,更新就会失败。
使用CAS后的应用场景如下:
- 客户端A获取到文档Martin的值,以及对应的CAS值
- 客户端B也获取到文档Martin的值,以及对应的CAS值
- 客户端A修改了文档,并且提交到数据库,同时提交CAS,本次更新成功,数据库也同步更新CAS
- 客户端B也修改了文档,并且尝试使用CAS进行数据库更新,本次更新失败,因为客户端的CAS与服务器存储的CAS现在不同了
因此,CAS提供了一种检查机制,保证你当前更新的文档自上次获取以来,没有发生变更过。
在编程代码里,CAS是一个类似于update()的函数。取决于环境的不同,你可能先要使用gets()函数来获取到文档信息和CAS值。
例如,在java里先用gets()获取文档信息和CAS值,接着用cas()方法来更新文档:
CASValue customer = client.gets("customer"); CASResponse casr = client.cas("customer", customer.getCas(), "new string value");
CAS的局限性是在客户端库这一级并没有强制执行它。假如你想对所有的更新操作使用CAS,就必须明确的使用它来代替标准的文档更新函数。