Use the query lock hint when joining tables #635
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When you perform a query using locking and a left-join, the lock is used in both the FROM and LEFT OUTER JOIN portions of the query:
ActiveRecord:
Person.lock(true).left_joins(:readers).loadSQL:
SELECT [people].* FROM [people] WITH(UPDLOCK) LEFT OUTER JOIN [readers] WITH(UPDLOCK) ON [readers].[person_id] = [people].[id]However, when you use the same query with a inner-join, the lock is not used in the INNER JOIN portion of the query:
ActiveRecord:
Person.lock(true).joins(:readers).loadSQL:
SELECT [people].* FROM [people] WITH(UPDLOCK) INNER JOIN [readers] ON [readers].[person_id] = [people].[id]This change will apply the lock hint to the inner-joins.
I came across this issue as we are trying to use NOLOCK hints on queries containing joins.
ActiveRecord:
Person.lock('WITH(NOLOCK)').joins(:readers).loadBefore change SQL:
SELECT [people].* FROM [people] WITH(NOLOCK) INNER JOIN [readers] ON [readers].[person_id] = [people].[id]After change SQL:
SELECT [people].* FROM [people] WITH(NOLOCK) INNER JOIN [readers] WITH(NOLOCK) ON [readers].[person_id] = [people].[id]