我正在构建一个Web应用程序,到目前为止,我已经为几个数据库表构建了CRUD。 现在,假设有2个用户正在使用该应用程序,并且他们都修改了同一个对象,但他们并不知道这一点。 因此,第一个用户完成对象的修改并期望该对象的某些状态,然后第二个用户完成他的修改,并且该对象现在将具有进入第二个用户的状态。 我该如何防止这种情况。感谢
答案 0 :(得分:0)
数据库通常支持现成的情况。 Azure Storage例如支持使用Optimistic Concurrency: https://docs.microsoft.com/en-us/azure/storage/storage-concurrency
它在Azure存储表(和blob)中的工作方式是azure为每个实体分配一个ETag值。如果更新实体,azure会更新实体上的etag值,您的第二个写入请求将失败,因为它仍具有旧的/未更新的ETag值。您将获得特定的Http状态代码(412),并且可以以确定的方式在客户端处理该方案。
客户端可以覆盖此ETag检查并根据需要发出无条件写入请求。因此,您确切问题的答案取决于您正在使用的存储技术。
我只是在这里给azure作为一个例子来解释Optimistic(又名无锁)并发是如何工作的。大多数现代数据库都提供了一种处理并发的机制,因此您应该检查底层存储系统的规范(您应该在问题中提到更准确)。