行鎖(Row Lock)
SQLSERVER
行鎖是在資料行層面上實施的鎖定。當你對特定的行執行操作時,SQL Server 通常會自動使用行鎖來確保資料的一致性和隔離性。
- 使用事務並指定隔離級別:在事務中使用適當的隔離級別可以使 SQL Server 在需要時使用行鎖。
BEGIN TRANSACTION;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 或其他適合的隔離級別
-- 執行需要行鎖的 SQL 語句
UPDATE Table1
SET Column1 = Value1
WHERE ID = SomeValue;
COMMIT TRANSACTION;
- 使用
ROWLOCK
提示:在查詢中新增ROWLOCK
提示可以指示 SQL Server 嘗試使用行鎖。
UPDATE Table1
SET Column1 = Value1
WHERE ID = SomeValue
OPTION (ROWLOCK);
MySQL
行鎖是在InnoDB儲存引擎中實現的,它只鎖定表中的一行資料。行鎖是自動加上的,當你在事務中執行以下操作時:
- SELECT ... FOR UPDATE: 當你希望更新所選擇的行時,可以使用這個語句加行鎖。
- SELECT ... LOCK IN SHARE MODE: 當你希望讀取某行並且確保其他事務不會更改這些行時,可以使用這個語句。
以下是示例:
START TRANSACTION; -- 開始事務
SELECT * FROM table_name WHERE id = 1 FOR UPDATE; -- 對id為1的行加行鎖
-- 執行一些更新操作
UPDATE table_name SET column_name = 'value' WHERE id = 1;
COMMIT; -- 提交事務,釋放鎖
表鎖(Table Lock)
SQLSERVER
表鎖是在整個表層面上實施的鎖定。當你需要對整個表進行操作時,表鎖會非常有用。
- 使用事務並指定表鎖:
BEGIN TRANSACTION;
-- 執行需要表鎖的 SQL 語句
SELECT * FROM Table1 WITH (TABLOCK);
COMMIT TRANSACTION;
- 使用
TABLOCK
提示:在查詢中新增TABLOCK
提示可以指示 SQL Server 使用表鎖。
INSERT INTO Table1 VALUES (Value1, Value2) OPTION (TABLOCK);
- 使用
HOLDLOCK
提示:如果你想要在整個事務期間持有表鎖,可以使用HOLDLOCK
** **
SELECT * FROM Table1 WITH (HOLDLOCK);
MySQL
表鎖可以鎖定整個表,使得其他事務不能對該表進行寫操作。表鎖可以在MyISAM和InnoDB儲存引擎中使用。
- LOCK TABLES: 這個語句可以顯式地對一個或多個表加鎖。
- UNLOCK TABLES: 用來釋放之前透過
LOCK TABLES
語句獲得的鎖。
以下是示例:
LOCK TABLES table_name WRITE; -- 對table_name表加寫鎖
-- 執行一些操作,比如插入、更新或刪除
INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2');
UNLOCK TABLES; -- 釋放鎖
- InnoDB儲存引擎:預設情況下,InnoDB會使用行鎖,當它檢測到事務中涉及到的行時。但是,在某些情況下,InnoDB也會退化到表鎖。
- MyISAM儲存引擎:預設使用表鎖。當你對MyISAM表執行查詢時,整個表會被鎖定,直到查詢完成。