rdbms能在事務中維護資料的完整性,這是通過資料庫物件實現的多種機制來實現的,下面列出的是4個最重要的物件:
在sql server中,鎖可以使多個使用者同時訪問,同一資料,並且保證在讀取資料時,資料不會被修改。同時,鎖也用來確保乙個程序在修改資料時,不和其他進行資料修改操作或者資料讀取操作的程序發生衝突。
sql server以連線為單位對鎖進行管理,這就是說,乙個鎖不能被多個連線同時持有;sql server也以事務為單位對鎖進行管理,和多個連線不能同時持有同乙個鎖一樣,多個事務也不能同時持有,同乙個鎖。
比如,假如乙個應用程式開啟了乙個sql server連線,這個連線在某個表上,被賦予了共享鎖,這個應用程式就不能再開啟乙個可以修改該錶資料的新連線。對事物也是一樣。如果乙個應用程式啟動了乙個用於修改特定資料的事務,那麼在這個事務的工作完成之前,其他任何事物,都不能修改這些資料。即使多個事務共享相同的連線,上述情況也成立。
sql server使用6種型別的鎖,更準確的說,是6種資源鎖模式:
共享鎖,更新鎖,排他鎖和意向鎖可用於表或索引的行、頁(表,或者索引所用的8kb的儲存頁面)、擴充套件(64kb的8個連續的索引或者表頁面)、表,資料庫。
模式鎖與批量更新鎖適用於表。
共享鎖
共享鎖允許多個連線和事務同時讀取所分配的共同資源。只要給連線和事務授予了共享鎖,任何其他連線或事務就不能修改資料。當乙個應用程式成功的讀取了資料之後,共享鎖通常會被釋放,但在某些特殊情況下,這個動作是可以修改的。例如:給整個事務分配了共享鎖,保證事務基於的資料,在該事務完成之前不被修改,從而最大限度的確保資料的一致性。這個擴充套件鎖,可用於事務一致性必須100%保證的情況,但持有鎖的代價是降低了資料的併發訪問,例如,要從儲蓄賬戶中取100美元,在包含儲蓄賬戶的餘額上放置乙個共享鎖。這些資料用於確保有足夠的資金支援這個取款操作。最好禁止其他連線修改該餘額,直到取款操作完成為止。 由於共享鎖之間是互相相容的,因此,不同的事務和連線在讀取相同的資料時,不會發生衝突。
更新鎖
sql server使用更新鎖,在防止出現死鎖的情況。出現死鎖是很糟糕的,通常死鎖是由於拙劣的程式設計技術造成的。當兩個程序爭奪同乙個資源時,就將發生死鎖。回到前面銀行的例子:在這個假定的銀行事務中,我妻子和我同時上線,將儲蓄賬戶中的資金轉帳到支票賬戶上。碰巧我們同時要進行轉賬,於是兩個程序分別啟動並執行了轉賬操作。當我的程序訪問這兩個賬戶時,程序在資源上發出了共享鎖。到目前為止一切還算正常,但是當我們的程序試圖修改資源時,混淆便隨之而來了。首先,我妻子的程序嘗試將共享鎖公升格為排他鎖,以便對資料進行修改。幾乎同時,我的程序也嘗試進行相同的公升格操作。然而,我們所共有的共享鎖阻止了任何乙個程序,實現公升格到排他鎖的企圖。由於沒有乙個程序願意釋放其,共享鎖,就發生了死鎖。
sql server不會對死鎖現象特別關照,假如死鎖發生了,sql server就會自動選擇其中的乙個程序,將它作為犧牲品而停止。sql server選擇與其關聯代價最小的程序,停止它,回滾相關事務,然後向相關應用程式中返回錯誤**1205.如果使用者正確的捕捉到了錯誤,就會得到這樣的訊息:「事務##在x資源上與其他程序,出現了死鎖,並被選擇為死鎖的犧牲品,重新執行事務」。
為了防止死鎖發生,sql server通常使用更新鎖來代替共享鎖。只有乙個程序可以得到更新鎖,這樣可以防止與其相對的程序公升格其擁有的鎖,其底線是,如果以更新為唯一目的而進行了讀操作,則sql server可以發出乙個更新鎖,而不是共享鎖,以便避免潛在的死鎖危險。sql提供了防止死鎖的邏輯,只要細心的規劃與實現,就可以避免死鎖的產生。
排他鎖
在執行修改操作時,sql server通常發出排他鎖。在更改一行彙總的某個字段值的時候,sql server授予相關程序訪問此行的排他訪問許可權。這樣的排他訪問,可以防止任何併發事務或者連線的相關程序,對處於修改中的資料,進行讀、更新、刪除操作。排他鎖與任何其他型別的鎖都不相容。
意向鎖
為了防止任何乙個併發事務,或者連線中的程序,在乙個已經被其他程序鎖住的資源上,放置排他鎖,sql server設計了意向鎖。比如,執行乙個事務,在表中更新單個行,sql server在該行上授予此事務排他鎖的同時,也在包含此行的表上授予此事務意向鎖。這樣就能防止其他程序在該表中放置排他鎖。
舉乙個現實中的例子:它可以解釋sql 程式設計中意向鎖的行為:使用者住進了sql旅館的404房間,現在具有使用4樓的房間4的唯一(排他)許可權。旅館的其他主顧都不允許進入此房間。而且沒有主顧可以將旅館的所有房間都預定下來,因為404房間已經被使用者單獨占用。對於旅館,使用者就有了意向鎖;而對於404房間,使用者有排他鎖。意向鎖,與其他比它低階的鎖,都是相容的。
批處理更新鎖
表上的批處理更新鎖允許多個批處理載入執行緒,把資料載入到表中,同時禁止其他型別的資料訪問。在表上啟用表鎖定時,或者用批處理操作選擇表鎖定選項時,就發出了批處理更新鎖。
鍵範圍鎖
在使用可序列化的隔離級別時,鍵範圍鎖保護結果集中隱含的乙個行範圍,不被t-sql語句讀取。可序列化的隔離級別要求,在事務中每次查詢時,都必須獲得相同的行集。鍵範圍鎖,禁止其他事務插入其鍵值(由可序列化的事務讀取)在指定的範圍內的新行,來滿足這個要求。
關係型資料庫完整性規則
不管你用的是sql server 還是mysql 它們都是關係型資料庫,那麼既然是關係型資料庫就要遵守 關係型資料庫的完整性規則 關係型資料庫提供了三類完整性規則,實體完整性規則,參照完整性規則,使用者自定義完成性規則 在這三類完成性規則中呢其中實體完整性規則和參照性完整性規則是關係模型必須滿足的完...
資料庫 完整性約束
問題描述 現有乙個商店的資料庫 shopping 記錄客戶及其購物情況,由以下四個關係組成 a 客戶表customer 儲存客戶資訊,包括客戶號customerid 客戶姓名cname 位址address 電子郵件email 性別gender 身份證號cardid 號碼telcode。b 商品表go...
資料庫的完整性約束
一 資料庫的完整性約束定義 資料庫的完整性約束是為了防止不符合規範的資料進入資料庫,在使用者對資料進行插入 修改 刪除等操作時,dbms自動按照一定的約束條件對資料進行監測,使不符合規範的資料不能進入資料庫,以確保資料庫中儲存的資料正確 有效 相容。資料庫的完整性約束包括 1 實體完整性 規定表的每...