Can a readcommitted isolation level ever result in a deadlock (Sql Server)?

前端 未结 2 1034
栀梦
栀梦 2021-02-14 04:55

My understanding of deadlocks is - two processes trying to contend for same resource - typically two processes trying to \'write\' to same row of data. If all one process is doi

2条回答
  •  长情又很酷
    2021-02-14 05:22

    ReadComitted Transaction Isolation Level initially obtains a Shared Lock on a resource i.e while reading the row but when we try to UPDATE the row it obtains an Exclusive lock on the resources. Multiple user can have shared locks on same rows and it wont effect but as soon as One user tries to update a row It gets an Exclusive Lock on the row which can result in A dead lock when a user who could initially see the record because of the shared locks on the row but now when the user tries to update it It already has an exclusive lock on it by the 1st user. Imagine a scenario where User1 and User2 Both has shared locks and when they try to update some records they both get Exclusive locks on the rows which other user need to commit the transaction. this will result in a DEAD LOCK.
    In case of a DeadLock if the Priority Level is not set SQL Server will wait for sometime and then it will RollBack the transaction which is cheaper to rollback.
    Edit
    Yes if User1 is only reading data and User2 trys to Update some data and there a non-clustered index on that table, it is possible.

    1) User1 is reading Some Data and obtains a shared lock on the non-clustered index in order to perform a lookup, and then tries to obtain a shared lock on the page contianing the data in order to return the data itself.

    2) User2 who is writing/Updating first obtains an exlusive lock on the database page containing the data, and then attempts to obtain an exclusive lock on the index in order to update the index.

提交回复
热议问题