免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3854 | 回复: 1
打印 上一主题 下一主题

[转贴] Informix數據庫的鎖技術 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-04 18:18 |只看该作者 |倒序浏览
                Informix數據庫的鎖技術
                   作者:不详
   

INFORMIX使用鎖技術解決在多用戶訪問數據庫情況下,對同一對象訪問的並發控制問題。INFORMIX
支持復雜的、可伸縮性的鎖技術。

鎖的類型

INFORMIX有三種不同類型的鎖。它們在不同的情況下使用。

1. SHARED鎖

SHARED鎖只保留對象的可讀性。當鎖存在時,對象不能改變。多個程序可對同個對象加SHARED鎖。

2. EXCLUSIVE鎖

只能使單個程序使用。在程序要改變對象時使用。當其他鎖存在時,EXCLUSIVE鎖不能使用。當使用了E
XCLUSIVE 鎖,其他鎖不能用同一對象。

3. PROMOTABLE鎖

實現更新的目的。PROMOTABLE鎖可以放在已經有SHARED鎖的記錄,但不能放在已經有PROMOTABLE鎖和EXCLUSIVE
鎖的地方。當記錄上無其他鎖(含SHARED 鎖)情況下,這時在程序準備改變鎖的記錄時,PROMOTABLE鎖可以提
升為EXCLUSIVE鎖。如果在已有SHARED鎖的記錄上設置了PROMOTABLE鎖,在PROMOTABLE鎖可以提升到EXCLUSIVE鎖
之前需要刪除SHARED 鎖。PROMOTABLE鎖只能在INFORMIX Universal Server中支持。

鎖的范圍

INFORMIX對數據鎖定提供了三種不同的方式,范圍由大到小分別是數據庫、表、記錄級鎖。使用的時機要看應
用狀況而定。

1. 數據庫級鎖

你可以用CONNECT, DATABASE, 或 CREATE DATABASE語句打開數據庫。打開數據庫的操作就在數據庫上設置了SHARED
鎖。只要程序打開一個數據庫,SHARED鎖就會阻止其他程序刪除數據庫或在數據庫上設置EXCLUSIVE鎖。你可以用語
句DATABASE database name EXCLUSIVE鎖定整個數據庫。若此時其他用戶正在使用該數據庫,該操作將返回錯誤。
一旦設置了EXCLUSIVE鎖,其他程序就不能打開數據庫,因為打開時要放置一個SHARED鎖。只有數據庫關閉時,數據
庫鎖才釋放。你可以用DISCONNECT或CLOSE DATABASE顯示地處理,也可以運行其他的DATABASE語句隱含的處理。一般
數據庫級EXCLUSIVE鎖是獨佔數據庫資源,防止其他程序訪問數據庫。它使得程序非常簡單,不會產生並發效果。常
用在非高峰時期要改變大量數據時如數據庫備份過程。

2. 表級鎖

INFORMIX提供兩種模式表級鎖:EXCLUSIVE MODE 和SHARE MODE。你可以鎖整個表。在某些情況下,這個操作是自動
進行。當INFORMIX處理下列語句時,一般鎖整個的表:ALTER INDEX 、ALTER TABLE 、CREATE INDEX、DROP INDEX 、
RENAME COLUMN、RENAME TABLE 。該語句結束或事務結束會釋放該鎖。在某些查詢語句中,INFORMIX也自動鎖整個表。
你可以用LOCK TABLE語句顯示地鎖整個表。該語句允許你對整個表設置EXCLUSIVE鎖或SHARED鎖。當你程序從表中讀取
數據時,SHARED鎖防止表中數據更新。INFORMIX Universal Server 通過設置隔離級別實現更大程度並發數據保護。
表級EXCLUSIVE鎖防止對同個表的並發使用。因此,如果其他許多程序要使用該表時,系統性能會受到嚴重影響。類
似數據庫級EXCLUSIVE鎖,表級EXCLUSIVE鎖常用在非高峰時期要改變大量數據時。例如,有些應用在高峰期間並不更
新表,它們可以在非高峰期間定期以批處理方式更新。

通過UNLOCK TABLE table name 解除鎖。當存在事務時,事務結束時解除鎖。

3. 記錄級、頁級、鍵字級鎖

表的一個記錄是可設置鎖的最小對象。一個程序可以鎖一個記錄或記錄的集合,同時其他程序可以操作同一個表的其
他記錄。Universal Server 以磁盤頁面(disk pages)為單位存儲數據。一個磁盤頁面包含一個或多個記錄。在有
些情況下,頁級鎖比單個鎖更好些。其他數據庫服務器可能不存在頁級、鍵字級鎖。

在Universal Server上,當你創建表時,你可以選擇使用記錄級鎖或頁級鎖。其他的數據庫服務器不提供這種選擇。
頁級、記錄級鎖有相同的效果。當Universal Server需要鎖一個記錄時,根據表創建時的鎖模式,鎖這個記錄或記錄
所在的頁面。在一定情況下,數據庫服務器需要鎖一個不存在的記錄。它的效果相當在記錄將要存在的地方放一個
鎖。當表使用記錄鎖時,對假想的記錄使用鍵字鎖。當表使用頁級鎖時,含有或可能含有鍵字的索引頁將被設置鍵級鎖。
鎖的時期

程序控制數據庫級鎖的時期。數據庫關閉時,數據庫鎖級也就釋放。表級、記錄級、索引級鎖的時期依賴使用的SQL
語句以及是否使用事務。如果數據庫沒有使用事務,也就是說,事務日志不存在並且你沒有使用COMMIT WORK語句,當
運行UNLOCK TABLE語句時,表級鎖就釋放。當使用了事務時,事務結束,表級、記錄級、索引級鎖都釋放。修改時鎖的
處理

當數據庫服務器通過一個更新遊標取一條記錄時,它在該記錄上設置一個PROMOTABLE鎖。如果這個動作成功,數據庫服
務器知道其他程序不能改變此記錄。因為PROMOTABLE鎖不是獨佔的,其他程序能夠繼續讀這條記錄。由在取此記錄的
程序執行UPDATE、DELETE語句或簡單地取下一條記錄之前,它可能花一些時間。這樣就提高了性能。當它改變一個記錄
時,數據庫服務器在這條記錄上設置一個EXCLUSIVE鎖。如果它已經有一個PROMOTABLE鎖,它將鎖改為EXCLUSIVE狀態。

EXCLUSIVE鎖的時期依賴是否使用事務。如果沒有使用事務,被修改的記錄寫到磁盤上就會釋放該鎖。當使用了事務時,
鎖就會保持到事務的結束。這個動作防止其他程序使用可能回滾到原來狀態的記錄。

當使用了事務時,只要刪除記錄鍵級鎖就會設置。使用鍵級鎖解決下列錯誤:程序A刪除一個記錄,程序B插入有同樣鍵的
記錄。程序A回滾事務,使數據庫服務器恢復了刪除的記錄,這時程序B插入的記錄怎辦?通過鎖索引,數據庫服務器等
到程序A提交事務時才插入記錄。

由 Universal Server數據庫服務器管理自己的鎖,所以它能提供不同類型的鎖。其他的數據庫服務器是通過操作系統
的特性實現鎖,所以不能提供多種選擇。有些操作系統通過操作系統服務方式向外提供鎖函數。在這些系統,數據庫支持
SET LOCK MODE語句。而有些操作系統不支持內核級的特性,數據庫這時通過在數據庫目錄下產生小文件實現鎖。這些文
件帶有.lok綴。如果你的程序使用單個SELECT語句或沒有用FOR UPDATE聲明的遊標提取一個記錄,此記錄不管是否被
一個未完成的交易上鎖會馬上被提取。這樣能產生最好的性能。當你使用FOR UPDATE聲明的遊標時,它在提取前將當前
記錄上鎖。如果當前記錄已經有鎖,隨作選擇模式的不同,程序會等待或返回錯誤。當取下一個記錄時,數據庫看當前
記錄是否更新(使用帶WHERE CURRENT OF 的UPDATE  


鎖的模式

鎖的模式決定程序遇到被鎖的數據會產生怎樣的結果。當程序要提取或修改一個上鎖的記錄時,會有下面幾種情況:

1、 數據庫馬上通過SQLCODE變量或SQLSTATE結構給程序返回一個錯誤代碼。

2、 在數據解鎖前,數據庫將程序掛起。

3、數據庫將程序掛起一段時間。如果鎖還未解,數據庫給程序返回一個錯誤代碼。

你可以通過SET LOCK MODE模式選擇以上結果。

如果你喜歡程序等待(對大多數程序而言這是最好的選擇),運行下列語句:SET LOCK MODE TO WAIT。

當設置了鎖模式,程序常忽視其他並發程序的存在性。如果程序需要訪問其他程序已上鎖的記錄時,它等待別的程序
解鎖,然繼續。延遲的時間常不可預測。

等待解鎖不利的一面就是可能會等待很長時間。如果不能接受很長延遲,程序可以運行下列語句:SET LOCK MODE TO  
NOT WAIT選擇不等待。當程序需要一個鎖記錄時,它馬上返回一個錯誤代碼,且當前的SQL語句終止。這時,程序必須回
滾當前的交易再試一次。程序開始時,數據庫初始設置為不等待。

當你使用UNIVERSAL SERVER時,你有另外的選擇。你可以讓數據庫設置等待時間的上限。你可用下列語句:SETLOCK MODE  
TO WAIT 18讓數據庫有18秒等待上限。若期間鎖還沒有解開,將返回錯誤代碼。

在每個程序都選擇了鎖等待模式情況下,有可能出現死鎖。死鎖是程序之間相互阻塞,每個程序在其他程序要訪問的對象
上設置了鎖。UNIVERSAL SERVER在單個網絡服務器情況下會馬上檢測到死鎖。如果程序選擇了鎖等待模式,通過給程序返
回錯誤代碼,你就知道你遇到了死鎖。而在多個數據庫服務器的情況下,UNIVERSAL SERVER不能馬上檢測到。每個數據庫
服務器都設置鎖等待的上限。如果超時,數據庫服務器就認為發生了死鎖且返回相關的錯誤代碼。數據庫管理員可以設置
和修改等待時間的上限。


论坛徽章:
11
数据库技术版块每日发帖之星
日期:2016-06-25 06:20:00数据库技术版块每日发帖之星
日期:2016-06-24 06:20:00数据库技术版块每日发帖之星
日期:2016-05-03 06:20:00数据库技术版块每日发帖之星
日期:2016-04-21 06:20:00数据库技术版块每日发帖之星
日期:2016-01-23 06:20:00数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-19 06:20:00数据库技术版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2016-07-30 06:20:00
2 [报告]
发表于 2003-01-04 21:05 |只看该作者

[转贴] Informix數據庫的鎖技術

UP
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP