亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

它已經被別的用戶以獨占方式打開,或沒有查看數據的權限?

它已經被別的用戶以獨占方式打開,或沒有查看數據的權限?

絕地無雙 2023-03-02 18:14:30
Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80004005' [Microsoft][ODBC Microsoft Access 驅動程序] Microsoft Jet 數據庫引擎打不開文件'(未知的)'。 
查看完整描述

1 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

這個錯誤產生的原因一般是同一條記錄的讀寫產生了沖突,也就是說同時被操作,于是會造成死鎖,認真檢查你的代碼吧。

當 Microsoft?0?3 SQL Server?6?4 遇到死鎖時發生該錯誤。當兩個(或多個)進程試圖訪問某個資源,而該資源上有另一個進程控制的鎖時,發生死鎖。因為每個進程都有對另一個資源的請求,所以各進程都不能完成。當檢測到死鎖時,SQL Server 將處理時間最少的命令回滾,并向客戶端應用程序返回錯誤信息 1205。該錯誤不是嚴重錯誤,且不會導致批處理終止。
對策
在某些情況下,死鎖條件將導致 DB-Library 函數(如 dbsqlexec、dbsqlok、dbresults 或 dbnextrow)返回 FAIL。程序應該始終檢查從每個 DB-Library 函數返回的代碼。如果這些 DB-Library 函數之一返回 FAIL,則程序應取消批處理并停止運行。在某些情況下,繼續執行批處理中的后續函數是有可能的。但是,因為發生了死鎖情況并且回滾了引起死鎖的函數,所以批處理中的后續函數將可能因更嚴重的錯誤(如"沒有找到對象")而失敗。
在其它情況下,死鎖條件不會導致 DB-Library 函數返回 FAIL。在這些情況下,程序必須在消息處理程序中檢查是否有錯誤信息 1205,并使用 dbsetuserdata 函數將此信息告知應用程序。然后程序必須在每個 DB-Library 調用之后檢查是否有死鎖指示符,如果檢測到死鎖則應取消批處理。
盡管在收到 1205 死鎖消息后取消批處理可能似乎沒有必要,但因為服務器并不總是終止死鎖情況下的批處理,所以這確實必要。如果未取消批處理,則任何時候試圖提交新的批處理時均將導致 DB-Library 錯誤 10038"結果掛起"。
還可以使用 SET DEADLOCK_PRIORITY 語句(LOW 或 NORMAL)。SET DEADLOCK_PRIORITY 控制在發生死鎖情況時會話的反應方式。如果設置為 LOW,則進程將成為死鎖情況下的首選犧牲品。如果設置為 NORMAL,則會話將使用默認的死鎖處理方法。
如果死鎖情況持續,則使用跟蹤標記 1204 收集更多信息通常很有用。跟蹤標記 1204 打印死鎖鏈和犧牲品,如以下示例輸出所示:
*** Deadlock Detected ***
==> Process 7 chosen as deadlock victim
== Deadlock Detected at: 1998-09-10 16:39:29.17
== Session participant information:
SPID: 7 ECID: 0 Statement Type: UPDATE
Input Buf: update t1 set c1 = c1 where c1 = 2
SPID: 8 ECID: 0 Statement Type: UPDATE
Input Buf: update t1 set c1 = c1 where c1 = 1

== Deadlock Lock participant information:
== Lock: KEY: 2:117575457:1 (010001000000)
Database: tempdb
Table: t1
Index: i1
- Held by: SPID 7 ECID 0 Mode "S"
- Requested by: SPID 8 ECID 0 Mode "X"
== Lock: KEY: 2:117575457:1 (020002000000)
Database: tempdb
Table: t1
Index: i1
- Held by: SPID 8 ECID 0 Mode "S"
- Requested by: SPID 7 ECID 0 Mode "X"
此死鎖信息可以解釋如下: 
第一部分顯示死鎖犧牲品、死鎖時間以及死鎖中涉及的會話。對于每個會話,顯示當前的 SPID、語句類型和輸入緩沖區的一部分。
第二部分顯示有關死鎖中涉及的鎖的詳細信息。從上面的輸出,注意死鎖涉及表 t1(索引 i1)上的鍵鎖。死鎖輸出顯示哪些進程擁有死鎖中涉及的鎖,哪些會話在等待鎖被授權以及相關聯的鎖模式。
根據默認,生成最小日志量的進程將選作死鎖犧牲品,并自動回滾。若要影響所回滾的會話,請為會話設置 DEADLOCK_PRIORITY。
出現這個問題首先要考慮數據庫設計的問題,檢查會不會由于循環鎖引起死鎖的問題,即關系互相依賴;第二就要檢查程序的問題,作為數據庫sa我認為應該從這三方面來檢查問題。
1、執行:
dbcc traceon (1204, 3605, -1)
go
dbcc tracestatus(-1)
go
目的是把鎖信息寫到日志上(../log/Errlog)文件上,以檢查分析鎖的產生;
2、設置lock_timeout變量的時間 
select @@lock_timeout (查詢當前設置)
set lock_timeout 1800 (設置當前會話的當前鎖超時設置,單位為毫秒)
這個應該和程序開發人員商量,嵌入在程序里。?。ㄎ醋鲞^,待測試:))
3、設置DEADLOCK_PRIORITY變量 
控制在發生死鎖情況時會話的反應方式。

查看完整回答
反對 回復 2023-03-06
  • 1 回答
  • 0 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號