# L15 Locks鎖定 ###### tags: `SQL` ## 概述 **Transactions**可確保資料的多次異動**同時完整**的寫入資料庫 **Locks**避免同時多人修改時產生衝突 ![](https://i.imgur.com/v6mGX2h.png =50%x) 預設時,當尚未Commit Tran時,其餘連線會**被鎖定LOCK**,無法查看資料 ->可由活動監視器看封鎖者和工作階段識別碼 點選 ![](https://i.imgur.com/QRlVQHh.png =8%x)活動監視器->處理序 ![](https://i.imgur.com/yJWxrFk.png) ## 鎖定機制優點: 由於資料庫為並行執行,透過LOCK可避免發生以下問題: * Lost Update 遺失更新 * Uncommited Dependency(Dirty Read)未認可交易相依 * Inconsistent Analysis(Nonrepeatable Read) 不一致分析 * Phantom Read ## Isolation Level 語法: ==**SET Transaction Level** 程度名稱== 可分為幾種程度: * Read Uncommitted 可允許Dirty Read(T1 Update, T2 Select),會看到改到一半的內容 * ==Read Committed== **預設**,允許Non-repeatable Read(T1 Select, T2 Update) * Reaptable Read **最常用**,允許Phantom Read(T1 Select, T2 Insert) * Searializable 最嚴格 * Snapshot SQL2005年後出現, 未Commit前,顯示修改前的內容 已Commit後,顯示修改後的內容 語法:需先修改資料庫 ==**Alter DataBase** 資料庫名稱 SET Allow_Snapshot_Isolation **ON**== 工具-> 選項-> 查詢執行-> SQL Server-> 進階 ![](https://i.imgur.com/Lke2n8t.jpg =80%x) ## 可鎖定的項目 | 項目 | 說明 | | -------- | ---------------- | | RID | 紀錄識別碼 | | Key | 索引頁中的鍵值列 | | Page | 資料列或索引頁 | | Extent | 八個連續頁面 | | Table | 資料表 | | Database | 資料庫 | ## 鎖定型態 * 基本鎖定型態 * **Shared**(S) ex.Select * **Exclusive**(X) ex.Insert, Delete, Update * 特殊狀況鎖定型態 * Intent 避免鎖定衝突(因為包含鎖定資料),可提升鎖定效能 * Update * Schema 結構 ex.當連線卻想刪除(或還原)資料庫時,會被鎖定 * Bulk Update 查看鎖定資訊: 1. 活動監視器Activity Window 2. ==sp_lock== 3. SQL Profiler 工具-> SQL Profiler 看到伺服器的任何狀況 4. Windows System Monitor ex.執行 ```sql= sp_lock ``` 結果為 ![](https://i.imgur.com/jRJdT8A.jpg =70%x) ## 動態鎖定 鎖的資料越多,執行成本越高,so 盡量不要寫Select*! ![](https://i.imgur.com/DdUyvlR.png =80%x) ## 逾時Time-Out 設定 為避免連線鎖定可在**容易被別人鎖定的連線上**設Time out時間。 預設沒有逾時設定 ==**SET Lock_TimeOut** 時間(**ms**)== 關閉逾時設定 ==**SET Lock_TimeOut -1**==