<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # LOCK ## Name LOCK?--?鎖定一個表 ## Synopsis ``` LOCK [ TABLE ] [ ONLY ] _name_ [ * ] [, ...] [ IN _lockmode_ MODE ] [ NOWAIT ] 這里的`_lockmode_`可以是下列之一: ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE ``` ## 描述 `LOCK TABLE`獲取一個表級鎖,必要時等待任何沖突的鎖釋放。 如果聲明了`NOWAIT`,那么`LOCK TABLE` 并不等待它所需要的鎖:如果無法立即獲取該鎖,那么該命令退出并且發出一個錯誤信息。 如果成功獲取了這個鎖,那么它就會在當前事務的余下部分一直保持。 沒有`UNLOCK TABLE`命令;鎖總是在事務結尾釋放。 在為那些引用了表的命令自動請求鎖的時候,PostgreSQL 總是盡可能使用最小限制的鎖模式。`LOCK TABLE`是為你在需要更嚴格的鎖的場合提供的。 例如,假設一個應用在"讀已提交"隔離級別上運行事務,并且它需要保證在表中的數據在事務的運行過程中都存在。 要實現這個目的,你可以在查詢之前對表使用`SHARE`鎖模式進行鎖定。 這樣將保護數據不被并發修改并且為任何更進一步的對表的讀操作提供實際的當前狀態的數據, 因為`SHARE`鎖模式與任何寫操作需要的`ROW EXCLUSIVE`模式沖突, 并且你的`LOCK TABLE` `_name_` IN SHARE MODE 語句將等到所有當前持有`ROW EXCLUSIVE`模式的鎖提交或回卷后才執行。因此, 一旦你獲得該鎖,那么就不會存在未提交的寫操作,并且其他人只能在你釋放鎖之后才能再次獲取鎖。 如果運行在`可重復讀`或`可串行化`隔離級別實現類似的效果的時候, 你必須在執行任何`SELECT`或數據修改語句之前運行一個`LOCK TABLE`語句。 一個`可重復讀`或`可串行化`事務的數據圖像將在其第一個`SELECT` 或者數據修改語句開始的時候凍結住。稍后的`LOCK TABLE`將仍然阻止并發的寫, 但它不能保證事務讀取的東西對應最近提交的數值。 如果一個此類的事務準備修改一個表中的數據,那么應該使用`SHARE ROW EXCLUSIVE`鎖模式, 而不是`SHARE`模式。這樣就保證任意時刻只有一個此類的事務運行。不這樣做就可能會死鎖: 當兩個并發的事務可能都請求`SHARE`模式,然后試圖更改表中的數據時, 兩個事務在實際執行更新的時候都需要`ROW EXCLUSIVE`鎖模式,但是它們無法再次獲取這個鎖。 請注意,一個事務自己的鎖是從不沖突的,因此一個事務可以在持有`SHARE` 模式的鎖的時候請求`ROW EXCLUSIVE`模式(但是不能在任何其它事務持有`SHARE` 模式的時候請求)。為了避免死鎖,所有事務應該保證以相同的順序對相同的對象請求鎖, 并且,如果涉及多種鎖模式,那么事務應該總是最先請求最嚴格的鎖模式。 有關鎖模式和鎖定策略的更多信息,請參考[Section 13.3](#calibre_link-1161)。 ## 參數 `_name_` 要鎖定的現存表的名字(可以有模式修飾)。如果在表名前聲明了`ONLY`,那么只有那一個表被鎖定。 如果沒有聲明`ONLY`,那么該表和它的所有后代表(如果有)都被鎖定。可選的,`*` 可以在表名后面指定,明確表明包含后代表。 命令`LOCK TABLE a, b;`等效于`LOCK TABLE a; LOCK TABLE b;`。 表是按照`LOCK TABLE`命令中聲明的順序一個接一個順序上鎖的。 `_lockmode_` 鎖模式聲明這個鎖和哪些鎖沖突。鎖模式在[Section 13.3](#calibre_link-1161)里描述。 如果沒有聲明鎖模式,那么使用最嚴格的模式`ACCESS EXCLUSIVE`模式。 `NOWAIT` 聲明`LOCK TABLE`不去等待任何沖突的鎖釋放: 如果無法不等待立即獲取所要求的鎖,那么事務退出。 ## 注意 `LOCK TABLE ... IN ACCESS SHARE MODE`需要在目標表上有`SELECT`權限。 所有其它形式的`LOCK`需要表級別的`UPDATE`,`DELETE` 或`TRUNCATE`權限。 `LOCK TABLE`在事務塊的外部沒什么用:鎖依然被持有直到聲明結束。 因此如果`LOCK`在一個事務塊外面使用,PostgreSQL會報告一個錯誤。 使用[BEGIN](#calibre_link-493)和[COMMIT](#calibre_link-494)(或[ROLLBACK](#calibre_link-495)) 定義一個事務塊。 `LOCK TABLE`只處理表級的鎖,因此那些有`ROW`字樣的鎖都是用詞不當。 這些模式名字通常應該理解為用戶試圖在一個被鎖定的表中獲取行級的鎖。同樣, `ROW EXCLUSIVE`模式也是一個可共享的表級鎖。一定要記住, 只要是涉及到`LOCK TABLE`,那么所有鎖模式都有相同的語意, 區別只是它們與哪種鎖沖突的規則。有關如何獲取一個行級鎖的信息,請參閱 [Section 13.3.2](#calibre_link-1162)和`SELECT`命令參考頁的 [_鎖定子句_](#calibre_link-1058)子句信息。 ## 例子 演示在往一個外鍵表上插入時在有主鍵的表上使用`SHARE`的鎖: ``` BEGIN WORK; LOCK TABLE films IN SHARE MODE; SELECT id FROM films WHERE name = 'Star Wars: Episode I - The Phantom Menace'; -- 如果記錄沒有返回則 ROLLBACK INSERT INTO films_user_comments VALUES (_id_, 'GREAT! I was waiting for it for so long!'); COMMIT WORK; ``` 在執行刪除操作時對一個有主鍵的表進行`SHARE ROW EXCLUSIVE`鎖: ``` BEGIN WORK; LOCK TABLE films IN SHARE ROW EXCLUSIVE MODE; DELETE FROM films_user_comments WHERE id IN (SELECT id FROM films WHERE rating < 5); DELETE FROM films WHERE rating < 5; COMMIT WORK; ``` ## 兼容性 在 SQL 標準里面沒有`LOCK TABLE`,可以使用`SET TRANSACTION` 來聲明當前事務的級別。PostgreSQL也支持這個, 參閱[SET TRANSACTION](#calibre_link-507)獲取詳細信息。 除了`ACCESS SHARE`, `ACCESS EXCLUSIVE`, `SHARE UPDATE EXCLUSIVE` 鎖模式外,PostgreSQL鎖模式和`LOCK TABLE` 語句都與那些在Oracle里面的兼容。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看