1
它們是否存在?我習慣使用dbms_lock在Oracle上進行顯式鎖定,但是在Informix上找不到類似的東西。informix上的命名/用戶鎖
它們是否存在?我習慣使用dbms_lock在Oracle上進行顯式鎖定,但是在Informix上找不到類似的東西。informix上的命名/用戶鎖
Oracle使用MVCC來控制對數據庫中數據的訪問。
Informix和DB2(以及其他DBMS)大部分時間都使用鎖定。
有語句來鎖定表:
LOCK TABLE tablename IN { SHARE | EXCLUSIVE } MODE;
如果你的數據庫沒有記錄,你可以解鎖一個表:
UNLOCK TABLE tablename;
如果您的數據庫記錄(正常勢態),那麼只能在事務內鎖定一個表,並在事務提交或回滾時釋放鎖。
此外,使用FOR UPDATE子句的遊標將鎖應用於行。然後您需要了解隔離級別,因爲讀取鎖定的持續時間取決於隔離級別,但更新鎖定(因爲行更改)總是持續到事務結束。事實上,如果您正在使用REPEATABLE READ(又名SERIALIZABLE —),那麼Informix的隔離級別與標準隔離級別相比就有一個複雜的故事),那麼所有語句都將鎖應用於處理的行,甚至用於確定哪些謂詞行被處理。這是確保隔離所必需的。
我明白你說什麼,但我不想阻止行或表,但進程。讓我們認爲(天真的例子),我有一個長壽命的存儲過程,插入一個PK(外部生成)如果不存在,並更新計數,如果它。如果同時發生對該SP的兩個呼叫,其中一個將會失敗,因爲兩者都會嘗試插入PK。在PL/SQL中,我可以使用信號量來確保互斥(通過dbms_lock.acquire)。如果可能的話,我想在Informix中也這樣做。 – Samuel 2012-04-03 09:49:47
有了正確的約束(重複值不允許),兩個過程中只有一個能夠插入給定的PK值。數據庫管理系統自動負責。 SPL(存儲過程語言)具有可用於從插入失敗中恢復的異常機制。我不確定如你所描述的添加鎖有什麼好處。它們不是構建在系統中的,但是如果你真的想這樣做,可以很容易地模擬,但我仍然不確定是否有這樣做的好處(除了不改變代碼)。 – 2012-04-03 13:39:26
有關Oracle DBMS_LOCK的一篇文章指出,您在Oracle中需要它們的一個原因是一個會話無法看到另一個會話的更新。這在Informix或其他基於鎖的DBMS中不是問題。根據隔離級別,會話可以查看其他會話一次提交的另一個會話的更改。我需要看到一個詳細的例子,說明你在做什麼以及Oracle爲什麼需要這些鎖定,以便有機會計算Informix中是否有問題需要解決,但是從我進行的有限和快速掃描完成後,我不確定在Informix中是否需要它們。 – 2012-04-03 13:49:41