Optimistic vs. Pessimistic locking

前端 未结 10 1071
庸人自扰
庸人自扰 2020-11-21 22:35

I understand the differences between optimistic and pessimistic locking. Now could someone explain to me when I would use either one in general?

And does the answer

10条回答
  •  故里飘歌
    2020-11-21 23:05

    When dealing with conflicts, you have two options:

    • You can try to avoid the conflict, and that's what Pessimistic Locking does.
    • Or, you could allow the conflict to occur, but you need to detect it upon committing your transactions, and that's what Optimistic Locking does.

    Now, let's consider the following Lost Update anomaly:

    The Lost Update anomaly can happen in the Read Committed isolation level.

    In the diagram above we can see that Alice believes she can withdraw 40 from her account but does not realize that Bob has just changed the account balance, and now there are only 20 left in this account.

    Pessimistic Locking

    Pessimistic locking achieves this goal by taking a shared or read lock on the account so Bob is prevented from changing the account.

    In the diagram above, both Alice and Bob will acquire a read lock on the account table row that both users have read. The database acquires these locks on SQL Server when using Repeatable Read or Serializable.

    Because both Alice and Bob have read the account with the PK value of 1, neither of them can change it until one user releases the read lock. This is because a write operation requires a write/exclusive lock acquisition, and shared/read locks prevent write/exclusive locks.

    Only after Alice has committed her transaction and the read lock was released on the account row, Bob UPDATE will resume and apply the change. Until Alice releases the read lock, Bob's UPDATE blocks.

    For more details about how data access frameworks use the underlying database pessimistic locking support, check out this article.

    Optimistic Locking

    Optimistic Locking allows the conflict to occur but detects it upon applying Alice's UPDATE as the version has changed.

    This time, we have an additional version column. The version column is incremented every time an UPDATE or DELETE is executed, and it is also used in the WHERE clause of the UPDATE and DELETE statements. For this to work, we need to issue the SELECT and read the current version prior to executing the UPDATE or DELETE, as otherwise, we would not know what version value to pass to the WHERE clause or to increment.

    For more details about how data access frameworks implement optimistic locking, check out this article.

    Application-level transactions

    Relational database systems have emerged in the late 70's early 80's when a client would, typically, connect to a mainframe via a terminal. That's why we still see database systems define terms such as SESSION setting.

    Nowadays, over the Internet, we no longer execute reads and writes in the context of the same database transaction, and ACID is no longer sufficient.

    For instance, consider the following use case:

    Without optimistic locking, there is no way this Lost Update would have been caught even if the database transactions used Serializable. This is because reads and writes are executed in separate HTTP requests, hence on different database transactions.

    So, optimistic locking can help you prevent Lost Updates even when using application-level transactions that incorporate the user-think time as well.

    For more details about application-level or logical transactions, check out this article.

    Conclusion

    Optimistic locking is a very useful technique, and it works just fine even when using less-strict isolation levels, like Read Committed, or when reads and writes are executed in subsequent database transactions.

    The downside of optimistic locking is that a rollback will be triggered by the data access framework upon catching an OptimisticLockException, therefore losing all the work we've done previously by the currently executing transaction.

    The more contention, the more conflicts, and the greater the chance of aborting transactions. Rollbacks can be costly for the database system as it needs to revert all current pending changes which might involve both table rows and index records.

    For this reason, pessimistic locking might be ore suitable when conflicts happen frequently, as it reduces the chance of rolling back transactions.

提交回复
热议问题