當前位置:首頁 » 操作系統 » 資料庫行死

資料庫行死

發布時間: 2022-11-27 00:58:46

① 請問資料庫死鎖會對哪些數據類型的的數據產生影響

11.5.1 鎖的概念
鎖(Lock) 是在多用戶環境下對資源訪問的一種限制。機制當對一個數據源加鎖後,此數據源就有了一定的訪問限制。我們就稱對此數據源進行了「鎖定」。在sql Server中,可以對以下的對象進行鎖定:

數據行(Row):數據頁中的單行數據;
索引行(Key):索引頁中的單行數據,即索引的鍵值;
頁(Page):頁是SQL Server 存取數據的基本單位,其大小為8KB;
盤區(Extent):一個盤區由8 個連續的頁組成;
表(Table);
資料庫(Database)。
11.5.2 鎖的類別
在SQL Server 中,鎖有兩種分類方法。
(1) 從資料庫系統的角度來看
鎖分為以下三種類型:

獨占鎖(Exclusive Lock)
獨占鎖鎖定的資源只允許進行鎖定操作的程序使用,其它任何對它的操作均不會被接受。執行數據更新命令,即INSERT、 UPDATE 或DELETE 命令時,SQL Server 會自動使用獨占鎖。但當對象上有其它鎖存在時,無法對其加獨占鎖。獨占鎖一直到事務結束才能被釋放。
共享鎖(Shared Lock)
共享鎖鎖定的資源可以被其它用戶讀取,但其它用戶不能修改它。在SELECT 命令執行時,SQL Server 通常會對對象進行共享鎖鎖定。通常加共享鎖的數據頁被讀取完畢後,共享鎖就會立即被釋放。
更新鎖(Update Lock)
更新鎖是為了防止死鎖而設立的。當SQL Server 准備更新數據時,它首先對數據對象作更新鎖鎖定,這樣數據將不能被修改,但可以讀取。等到SQL Server 確定要進行更新數據操作時,它會自動將更新鎖換為獨占鎖。但當對象上有其它鎖存在時,無法對其作更新鎖鎖定。

(2)從程序員的角度看
鎖分為以下兩種類型:

樂觀鎖(Optimistic Lock)
樂觀鎖假定在處理數據時,不需要在應用程序的代碼中做任何事情就可以直接在記錄上加鎖、即完全依靠資料庫來管理鎖的工作。一般情況下,當執行事務處理時SQL Server會自動對事務處理范圍內更新到的表做鎖定。
悲觀鎖(Pessimistic Lock)
悲觀鎖對資料庫系統的自動管理不感冒,需要程序員直接管理數據或對象上的加鎖處理,並負責獲取、共享和放棄正在使用的數據上的任何鎖。
11.5.3 隔離級別
隔離(Isolation) 是計算機安全學中的一種概念,其本質上是一種封鎖機制。它是指自動數據處理系統中的用戶和資源的相關牽制關系,也就是用戶和進程彼此分開,且和操 作系統的保護控制也分開來。在SQL Server 中,隔離級(Isolation Level) 是指一個事務 和其它事務的隔離程度,即指定了資料庫如何保護(鎖定)那些當前正在被其它用戶或伺服器請求使用的數據。指定事務的隔離級與在SELECT 語句中使用鎖定選項來控制鎖定 方式具有相同的效果。
在SQL Server 中有以下四種隔離級:

READ COMMITTED
在此隔離級下,SELECT 命令不會返回尚未提交(Committed) 的數據,也不能返回臟數據。它是SQL Server 默認的隔離級。
READ UNCOMMITTED
與READ COMMITTED 隔離級相反,它允許讀取已經被其它用戶修改但尚未提交確定的數據。
REPEATABLE READ
在此隔離級下,用SELECT 命令讀取的數據在整個命令執行過程中不會被更改。此選項會影響系統的效能,非必要情況最好不用此隔離級。
SERIALIZABLE
與DELETE 語句中SERIALIZABLE 選項含義相同。
隔離級需要使用SET 命令來設定其語法如下:
SET TRANSACTION ISOLATION LEVEL
{READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE }

11.5.4 查看鎖
可以通過企業管理器或存儲過程來查看鎖。
(1) 用Enterprise Manager 查看鎖
在企業管理器中選擇目錄樹窗口中「Management」 文件夾下,「Current Activity」 中的「Locks / Process ID」 節點,則可以查看當前鎖定的進程;選擇同級的「Locks / Object」節點下的相應位元組點,則可以查看當前鎖定的對象,如圖11-1 所示。在圖11-1 中,右鍵單擊任務板窗口中的對象,從快捷菜單中選擇「屬性」選項,則會出現如圖11-2 所示的鎖的進程細節對話框。在此,可以刷新或殺死鎖的進程。

殺死進程還可以用如下Transact-SQL 命令來進行:
KILL spid
spid 是System Process ID, 即系統進程編號的縮寫,如圖11-1 中所示。

圖11-2 鎖定的進程細節

(2) 用系統存儲過程Sp_lock 查看鎖
存儲過程Sp_lock 的語法如下:
sp_lock spid
SQL Server 的進程編號spid 可以在master.dbo.sysprocesses 系統表中查到。spid 是INT類型的數據,如果不指定spid ,則顯示所有的鎖。

11.5.5 死鎖及其防止
死鎖(Deadlocking) 是在多用戶或多進程狀況下,為使用同一資源而產生的無法解決的爭用狀態,通俗地講,就是兩個用戶各佔用一個資源,兩人都想使用對方的資源,但同時又不願放棄自己的資源,就一直等待對方放棄資源,如果不進行外部干涉,就將一直耗下去。

死鎖會造成資源的大量浪費,甚至會使系統崩潰。在SQL Server 中解決死鎖的原則是「犧牲一個比兩個都死強」,即挑出一個進程作為犧牲者,將其事務回滾,並向執行此進程的程序發送編號為1205 的錯誤信息。而防止死鎖的途徑就是不能讓滿足死鎖條件的情況發生,為此,用戶需要遵循以下原則:

盡量避免並發地執行涉及到修改數據的語句;
要求每個事務一次就將所有要使用的數據全部加鎖,否則就不予執行;
預先規定一個封鎖順序所有的事務,都必須按這個順序對數據執行封鎖,例如,不同的過程在事務內部對對象的更新執行順序應盡量保持一致;
每個事務的執行時間不可太長,對程序段長的事務可考慮將其分割為幾個事務。
本章小結
本章中介紹了數據更新的方法及事務和鎖的概念。除了使用本章講述的語句更新數據外,還可以使用視圖來更新數據,有關視圖的運用請參見第13 章「游標和視圖」。

② 用sql語句,怎麼解決mysql資料庫死鎖

MySQL死鎖問題的相關知識是本文我們主要要介紹的內容,接下來我們就來一一介紹這部分內容,希望能夠對您有所幫助。
1、MySQL常用存儲引擎的鎖機制
MyISAM和MEMORY採用表級鎖(table-level locking)
BDB採用頁面鎖(page-level locking)或表級鎖,默認為頁面鎖
InnoDB支持行級鎖(row-level locking)和表級鎖,默認為行級鎖
2、各種鎖特點
表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,並發度最低
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,並發度也最高
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,並發度一般
3、各種鎖的適用場景
表級鎖更適合於以查詢為主,只有少量按索引條件更新數據的應用,如Web應用
行級鎖則更適合於有大量按索引條件並發更新數據,同時又有並發查詢的應用,如一些在線事務處理系統
4、死鎖
是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
表級鎖不會產生死鎖。所以解決死鎖主要還是針對於最常用的InnoDB。
5、死鎖舉例分析
在MySQL中,行級鎖並不是直接鎖記錄,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種,如果一條sql語句操作了主鍵索引,MySQL就會鎖定這條主鍵索引;如果一條語句操作了非主鍵索引,MySQL會先鎖定該非主鍵索引,再鎖定相關的主鍵索引。
在UPDATE、DELETE操作時,MySQL不僅鎖定WHERE條件掃描過的所有索引記錄,而且會鎖定相鄰的鍵值,即所謂的next-key locking。
例如,一個表db。tab_test,結構如下:
id:主鍵;
state:狀態;
time:時間;
索引:idx_1(state,time)
出現死鎖日誌如下:
?***(1) TRANSACTION:
?TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OSthread id 278546 starting index read
?mysql tables in use 1, locked 1
?LOCK WAIT 3 lock struct(s), heap size 320
?MySQL thread id 83, query id 162348740 dcnet03 dcnet Searching rows for update
?update tab_test set state=1064,time=now() where state=1061 and time < date_sub(now(), INTERVAL 30 minute) (任務1的sql語句)
?***(1) WAITING FOR THIS LOCK TO BE GRANTED: (任務1等待的索引記錄)
?RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0 677833455 _mode X locks rec but not gap waiting
?Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0
?0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 8616e642e706870; asc xxx.com/;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;
?*** (2) TRANSACTION:
?TRANSACTION 0 677833454, ACTIVE 0 sec, process no 11397, OS thread id 344086 updating or deleting, thread declared inside InnoDB 499
?mysql tables in use 1, locked 1
?3 lock struct(s), heap size 320, undo log entries 1
?MySQL thread id 84, query id 162348739 dcnet03 dcnet Updating update tab_test set state=1067,time=now () where id in (9921180) (任務2的sql語句)
?*** (2) HOLDS THE LOCK(S): (任務2已獲得的鎖)
?RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0 677833454 lock_mode X locks rec but not gap
?Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0
?0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 8616e642e706870; asc uploadfire.com/hand.php;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;
?*** (2) WAITING FOR THIS LOCK TO BE GRANTED: (任務2等待的鎖)
?RECORD LOCKS space id 0 page no 843102 n bits 600 index `idx_1` of table `db/tab_test` trx id 0 677833454 lock_mode X locks rec but not gap waiting
?Record lock, heap no 395 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
?0: len 8; hex 8000000000000425; asc %;; 1: len 8; hex 800012412c66d29c; asc A,f ;; 2: len 8; hex 800000000097629c; asc b ;;
?*** WE ROLL BACK TRANSACTION (1)
?(回滾了任務1,以解除死鎖)
原因分析:
當「update tab_test set state=1064,time=now() where state=1061 and time < date_sub(now(), INTERVAL 30 minute)」執行時,MySQL會使用idx_1索引,因此首先鎖定相關的索引記錄,因為idx_1是非主鍵索引,為執行該語句,MySQL還會鎖定主鍵索引。
假設「update tab_test set state=1067,time=now () where id in (9921180)」幾乎同時執行時,本語句首先鎖定主鍵索引,由於需要更新state的值,所以還需要鎖定idx_1的某些索引記錄。
這樣第一條語句鎖定了idx_1的記錄,等待主鍵索引,而第二條語句則鎖定了主鍵索引記錄,而等待idx_1的記錄,這樣死鎖就產生了。
6、解決辦法
拆分第一條sql,先查出符合條件的主鍵值,再按照主鍵更新記錄:
?select id from tab_test where state=1061 and time < date_sub(now(), INTERVAL 30 minute);
?update tab_test state=1064,time=now() where id in(......);

③ 向資料庫添加5000W行數據,怎樣避免卡死sql

建立約束,比如你那個欄位叫 aaa int check (Cj>0 and Cj<5000) 大於0且小於5000

④ sybase資料庫莫名死機執行管理和sql語句都死機,而且重啟服務和計算機都不行,只有強行終止進程!

sybase的健壯性還是很好的,老牌的資料庫了。

查一下
1、用dbcc checkdb語句查看各個資料庫有沒有壞了。
2、查一下是不是設置過表常駐內存的操作,如果這個設置過了的話,那可能是把一些大表設置成了常駐內存,從而導致「死機」;

如果以上兩個發現原因,那就再到網上查詢相應的處理方法;如果沒有查到原因的話,應該可以看一下sybase的日誌文件。

⑤ 資料庫:如何使一張表產生死鎖現象從而無法訪問

oracle的測試例子,使用它的sqlplus連接,默認為非自動提交。如果是MSSQL,則需要你把它的查詢選項中的自動提交改為非自動提交
create table t5(id int,sp varchar(10));

declare
begin
for i in 1..10 loop
insert into t5 values(i,'test'||i);
end loop;
end;
/

session 1(一個連接):
update t5 set id=99 where id=10;------行加IX鎖

session 2(第二個連接):
update t5 set id=id+1;-------------表等候加IX鎖

session 1:
update t5 set id=id-1 where id>8;------發生死鎖,session 2事務回滾

⑥ 資料庫數據輸入前幾行沒有問題,到第九行就不行了,後面的也輸不進去,這是怎麼回事其他的表都沒有問題。

這是因為資料庫中有相同的行(主鍵相同),你這里有兩個007
當修改其中一行時候,資料庫不懂修改的是哪行007,導致異常

解決辦法,將異常數據用SQL語句刪除後再錄入數據
delete from 表 where sno='007'

後面的008、009、010也會遇到同樣問題,做同樣操作

⑦ 資料庫有上萬條數據,如果正常讀取,頁面肯定會卡死,sql如何實現讀取並能快速的顯示到頁面上,asp.net!

分頁功能,每一次SQL語句(或者存儲過程)查詢後只返回10~20行(行數可以自定義)的數據。就可以了。再說了,載入上萬筆數據也沒有意義。

⑧ DB2資料庫發生死鎖了怎麼辦

db2 get snapshot for locks on sample
db2 get db cfg for sample
db2 update db cfg using dlchktime 10000
-查看資料庫管理器級別快照信息
db2 get snapshot for dbm
-查看資料庫級別快照信息
db2 get snapshot for database on dbname
-查看應用級別快照信息
db2 get snapshot for application agentid appl-handler
註:appl-handler可以從list applicaitions的輸出中得到
-查看錶級別快照信息
db2 get snapshot for tables on dbname
註:需要把tables快照開關設為ON才會有作用
-查看鎖快照信息
db2 get snapshot for locks on dbname

db2 get snapshot for locks on for application agentid appl-handler
-查看動態sql語句快照信息
db2 get snapshot for dynamic sql on dbname

db2 get monitor switches
db2 update monitor switches using lock on statement on
create event monitor mymonitor for deadlocks,statements write to file 'c:/temp'
set event monitor mymonitor state 1
db2evmon - path 'c:/temp'

--轉自:http://blog.csdn.NET/rodjohnsondoctor/article/details/4323514

---

第1頁:上線前的准備
第2頁:維護時的注意事項
第3頁:發生死鎖後的對策

【IT168 技術文檔】在新的資料庫應用系統上線初期,由於測試不完善或不熟悉DB2的機制,常會出現鎖等待死鎖等現象存在於我們的應用系統中,如何捕獲鎖等待或死鎖信息並解決鎖問題,是保證平穩上線必須面對的問題。目前應用系統最常使用的DB2資料庫版本有多個,有8.1,8.2,9.1還有新推出的9.5,對於不同版本的DB2資料庫提供的解決辦法不盡相同,下面對於上述問題的解決作了一個簡單說明,希望對大家有用。

首先在上線前有幾件跟鎖相關的事情需要開發設計人員一定要做好

1. 相關參數的更改

注冊表變數參數:

DB2_EVALUNCOMMITTED=on 當啟用此變數時,在可能的情況下,它將進行表或索引訪問掃描以延遲或避免行鎖定,直到知道數據記錄滿足謂詞求值為止。

DB2_SKIPDELETED=on 當啟用此變數時,在可能的情況下,它允許使用無條件地跳過已刪除的鍵或跳過已刪除的行。

DB2_SKIPINSERTED=on 當啟用此變數時,在可能的情況下,它允許跳過未落實的已插入行,就好像從未插入這些行一樣。

資料庫參數:

LOCKLIST 鎖定列表的內存量,當此參數設置為 AUTOMATIC 時,就啟用了自調整功能。這允許內存調整器根據工作負載需求變化動態地調整此參數控制的內存區大小。如果不是自動,需要設置相對大一些;DB2默認是行鎖,每個行鎖大約佔64或128個位元組(64位資料庫),計算鎖定列表內存的大小公式是: ( 每個應用程序的平均鎖定數目的估計值 * 每個鎖定所需的位元組數(128或64) * maxappls(或者max_coordagents) /4096 ) * 120%,這里只是建議公式,實際情況還要視操作系統實際的內存量來定。

MAXLOCKS 升級前鎖定列表的最大百分比,默認是22%(windows)或10%(unix),可以根據要求自行改動,計算公式是 2 * 100 / maxappls

DLCHKTIME 死鎖檢測時間間隔,默認是10000毫秒(10秒),可以根據要求自行改動,也可不動。增大此參數以降低檢查死鎖的頻率,因此增加應用程序必須等待消除死鎖的時間。 減小此參數會增大檢查死鎖的頻率,從而減少應用程序必須等待死鎖解決的時間,但是會增加資料庫管理器檢查死鎖所花的時間。

LOCKTIMEOUT 鎖等待時間,默認是 -1,也就是永遠等待,請改成固定的值,在事務處理(OLTP)環境中,可以使用 30 秒的初始啟動值。在一個只查詢的環境中,您可以從一個較高的值開始。

LOGFILSIZ 日誌文件大小,此參數定義每個主日誌文件和輔助日誌文件的大小。如果資料庫要運行大量更新、刪除或插入事務,而這將導致日誌文件很快變滿,則應增大日誌文件,了解您的並發應用程序的日誌記錄需求,來確定一個不會分配過量而浪費空間的日誌文件大小。

LOGPRIMARY 主日誌文件數,了解您的並發應用程序的日誌記錄需求,適當增大日誌文件數。

注意: 在更新參數時,需要注意有些參數在更改後需要重新啟動資料庫DB2實例才可以生效;有些參數需要斷開當前所有的應用程序,重新鏈接才能生效;有些參數可以立即生效,使用者請參考相關文檔,注意參數生效特性。

2. 應用程序設計

-程序盡量短小精悍

-程序盡量晚地訪問關鍵資源

-程序盡可能快地提交工作

-程序盡可能快地關閉游標

-建立合適索引

3. 性能測試

要根據將來實際的並發用戶數和數據量進行測試

上線之後維護時我們要做的幾件事情

1. 做好定期維護

通過使用如下命令進行維護:
-reorg表和索引定期重組
-runstats表和索引的統計信息定期更新
-rebind 程序包定期重新編譯

⑨ 如何防止插入刪除表造成的資料庫死鎖

當系統使用頻繁就會出現插入操作和刪除操作同時進行的情況。這個時候插入事務會先將主表A放置獨占鎖,然後去訪問子表B,而同時刪除事務會對子表B放置獨占鎖,然後去訪問主表A。插入事務會一直獨占著A表,等待訪問B表,刪除事務也一直獨占著B表等待訪問A表,於是兩個事務相互獨佔一個表,等待對方釋放資源,這樣就造成了死鎖。
遇到這種情況我聽說了二種做法:1 刪除A表數據之前,先使用一個事務將B表中相關外鍵指向另外A表中的另外一個數據(比如在A表中專門建一行數據,主鍵設置為0,永遠不會對這行數據執行刪除操作),這樣就消除了要被刪除的數據在AB兩個表中的關系。然後就可以使用刪除事務,先刪除A表中的數據,再刪除B表中的數據,以達到和插入事務表訪問一致,避免死鎖。2 在外鍵關系中,將「刪除規則」設置為「層疊」,這樣刪除事務只需要直接去刪除主表A,而不需要對子表B進行操作。因為刪除規則設置為層疊以後,刪除主表中的數據,子表中所有外鍵關聯的數據也同時刪除了。以上二個解決辦法 1 多了一次更新操作,2還可以 ,一般插入時不需要使用事務,刪除時用cascade 插入時可能出現的數據不完整,在讀取時作驗證,不完整數據直接忽略,跑作業定期清理。因為無論插入時使用不使用事務,讀取時都要作驗證以確保數據正確性而不致程序出錯,對應的定期數據清理也是必不可少的,所以並不會因為插入時不使用事務而造成過多的資料庫訪問。用方法2,並規范相關操作的調用,比如通過許可權設定限定刪除操作不會被隨意執行,更大程度上避免誤刪。第2種做法是值得推薦的做法,雖然具有一定性能影響,但是從數據的一致性考慮,是最佳的。

察看死鎖
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo,
dba_objects ao,
v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid
order by ao.object_name ;

清除死鎖

alter system kill session sid,.serial#

熱點內容
我配置很高了ae為什麼卡 發布:2025-05-17 14:54:50 瀏覽:167
python數據分析實戰pdf 發布:2025-05-17 14:49:42 瀏覽:950
海瀾之家廣告腳本 發布:2025-05-17 13:56:06 瀏覽:32
手文件夾恢復 發布:2025-05-17 13:53:32 瀏覽:995
linux怎麼看進程 發布:2025-05-17 13:53:30 瀏覽:305
thinkphp欄位緩存 發布:2025-05-17 13:52:01 瀏覽:577
山靈app安卓版如何設置 發布:2025-05-17 13:51:49 瀏覽:390
帆布壓縮袋 發布:2025-05-17 13:26:27 瀏覽:462
c語言16進製表示方法 發布:2025-05-17 13:11:25 瀏覽:484
ftp單位 發布:2025-05-17 13:10:03 瀏覽:146