To lock rows for update in SQL Server, you can use the WITH (UPDLOCK)
hint. This hint is used in the SELECT
statement to acquire an update lock on the rows, preventing other transactions from modifying them until the transaction is complete.
Here’s how you can use the WITH (UPDLOCK)
hint in SQL Server:
Example: Using WITH (UPDLOCK)
in SQL Server
Single Table Selection with Update Lock:
BEGIN TRANSACTION;
-- Acquire an update lock on the selected rows
SELECT *
FROM table_name
WITH (UPDLOCK)
WHERE condition;
-- Perform the update
UPDATE table_name
SET column_name = value
WHERE condition;
COMMIT TRANSACTION;
BEGIN TRANSACTION;
-- Acquire an update lock on the rows from both tables
SELECT *
FROM table1
JOIN table2 ON table1.id = table2.id
WITH (UPDLOCK)
WHERE table1.condition AND table2.condition;
-- Perform the update
UPDATE table1
SET table1.column_name = value
FROM table1
JOIN table2 ON table1.id = table2.id
WHERE table1.condition AND table2.condition;
COMMIT TRANSACTION;
Explanation
- BEGIN TRANSACTION: Starts a new transaction.
- WITH (UPDLOCK): Acquires an update lock on the selected rows.
- SELECT: Retrieves the rows to be locked.
- UPDATE: Performs the update on the locked rows.
- COMMIT TRANSACTION: Commits the transaction, releasing the locks.
Handling Set Operations
If you are dealing with set operations like UNION
, INTERSECT
, or EXCEPT
, and you need to lock rows for update, you should ensure that the rows are locked before performing the set operation. SQL Server does not support the FOR UPDATE
clause with set operations, so you need to handle locking and updating separately.
Example with Set Operations
If you want to lock rows and perform a set operation, consider breaking it into separate steps:
- Lock rows using
WITH (UPDLOCK)
. - Perform the set operation in a subsequent step.
BEGIN TRANSACTION;
-- Step 1: Lock rows in table1
SELECT *
FROM table1
WITH (UPDLOCK)
WHERE condition;
-- Step 2: Perform the set operation (e.g., UNION)
SELECT column1, column2
FROM table1
WHERE condition
UNION
SELECT column1, column2
FROM table2
WHERE condition;
-- Step 3: Update the locked rows
UPDATE table1
SET column_name = value
WHERE condition;
COMMIT TRANSACTION;