當前位置:首頁 » 編程語言 » sqlserver回退
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlserver回退

發布時間: 2023-05-22 21:47:12

Ⅰ 減少sqlServer資料庫死鎖的方法

如果兩個用戶進程分別鎖定了不同的資源,接著又試圖鎖定對方所鎖定的資源,就會產生死鎖。此時,SQL Server將自動地選擇並中止其中一個進程以解除死鎖,使得另外一個進程能夠繼續處理。系統將回退被中止的事務,並向被回退事務的用戶發送錯誤信息。
大多數設計良好的應用都會在接收到這個錯帶碼伏誤信息之後重新提交該事務,此時提交成功的可能性是很大的。但是,如果伺服器上經常出現這種情況,就會顯著地降低伺服器性能。為避免死鎖,設計應用應當遵循一定的原則,包括:
◆讓應用每次都以相同的次序訪問伺服器資源。
◆在事務期間禁止任何用戶輸入。應當在事務開始之前收集用戶輸入。
◆盡量保持事務的短小和簡單。
◆如合適的話,為運行事務的用戶連接指定盡可能低的隔離級別。[適用於6.5,7.0,2000]
此外,對於SQL Server的死鎖問題,下面是幾則實踐中很有用的小技巧。
◆使用SQL Server Profiler的Create Trace Wizard運行「Identify The Cause of a Deadlock」跟蹤來輔助識別死鎖問題,它將提供幫助查找資料庫產生死鎖原因的原始數據。[適用於7.0,2000]
◆如果無法消除應用中的所有死鎖,請確保提供了這樣一種程序邏輯:它能夠在死鎖出現並中止用戶事務之後,以隨機的時間間隔蠢攜自動重新提交事務。這里等待時間的隨機性非常重要,這是因為另一個競爭的事務也可能在等待,我們不應該讓兩個競爭的事務等待同樣的時間,然後再在同一時間執行它們,這樣的話將導致新的死鎖。[適用於6.5,7.0,2000]
◆盡可能地簡化所有T-SQL事務。此舉將減少各種類型的鎖的數量,有助於提高SQL Server應用的整體性能。如果可能的話,應將較復雜的事務分割成多個較簡單的事務。[適用於6.5,7.0,2000]
◆所有條件邏輯、變數賦值以及其他相關的預備設置操作應當在事務之外完成,而不應該放到事務之內。永遠不要為了接受用戶輸入而暫停某個事務,用戶輸入應當總是在事務之外完成。[適用於6.5,7.0,2000]
◆在存儲過程內封裝所有事務,包括BEGIN TRANSACTION和COMMIT TRANSACTION語句。此舉從兩個方面幫助減少阻塞的鎖。首先,它限制了事務運行時客戶程序和SQL Server之間的通信,從而使得兩者之間的任何消息只能出現於非事務運行時間(減少了事務運行的時間)。其次,由於存儲過程強制它所啟模雹動的事務或者完成、或者中止,從而防止了用戶留下未完成的事務(留下未撤銷的鎖)。[適用於6.5,7.0,2000]
◆如果客戶程序需要先用一定的時間檢查數據,然後可能更新數據,也可能不更新數據,那麼不要在整個記錄檢查期間都鎖定記錄。假設大部分時間都是檢查數據而不是更新數據,那麼處理這種特殊情況的一種方法就是:先選擇出記錄(不加UPDATE子句。UPDATE子句將在記錄上加上共享鎖),然後把它發送給客戶。
如果用戶只查看記錄但從來不更新它,程序可以什麼也不做;反過來,如果用戶決定更新某個記錄,那麼他可以通過一個WHERE子句檢查當前的數據是否和以前提取的數據相同,然後執行UPDATE。
類似地,我們還可以檢查記錄中的時間標識列(如果它存在的話)。如果數據相同,則執行UPDATE操作;如果記錄已經改變,則應用應該提示用戶以便用戶決定如何處理。雖然這種方法需要編寫更多的代碼,但它能夠減少加鎖時間和次數,提高應用的整體性能。[適用於6.5,7.0,2000]
◆盡可能地為用戶連接指定具有最少限制的事務隔離級別,而不是總是使用默認的READ COMMITTED。為了避免由此產生任何其他問題,應當參考不同隔離級別將產生的效果,仔細地分析事務的特性。[適用於6.5,7.0,2000]
◆使用游標會降低並發性。為避免這一點,如果可以使用只讀的游標則應該使用READ_ONLY游標選項,否則如果需要進行更新,嘗試使用OPTIMISTIC游標選項以減少加鎖。設法避免使用SCROLL_LOCKS游標選項,該選項會增加由於記錄鎖定引起的問題。[適用於6.5,7.0,2000]
◆如果用戶抱怨說他們不得不等待系統完成事務,則應當檢查伺服器上的資源鎖定是否是導致該問題的原因。進行此類檢查時可以使用SQL Server Locks Object: Average Wait Time (ms),用該計數器來度量各種鎖的平均等待時間。
如果可以確定一種或幾種類型的鎖導致了事務延遲,就可以進一步探究是否可以確定具體是哪個事務產生了這種鎖。Profiler是進行這類具體分析的工具。[適用於7.0,2000]
◆使用sp_who和sp_who2(SQL Server Books Online沒有關於sp_who2的說明,但sp_who2提供了比sp_who更詳細的信息)來確定可能是哪些用戶阻塞了其他用戶。[適用於6.5,7.0,2000]
◆試試下面的一個或多個有助於避免阻塞鎖的建議:1)對於頻繁使用的表使用集簇化的索引;2)設法避免一次性影響大量記錄的T-SQL語句,特別是INSERT和UPDATE語句;3)設法讓UPDATE和DELETE語句使用索引;4)使用嵌套事務時,避免提交和回退沖突。[適用於6.5,7.0,2000]

Ⅱ sql server 中的update語句回滾怎麼寫啊

回滾要放在事務裡面進行,才能進行回滾;sql裡面的事務使用關鍵字TransAction
1:可以用try catch捕獲
begin try
begin tran
update table set a=1;
commit tran
end Try
begin catch
rollback tran
end catch

2:可以使用error 全局變數
begin tran
update tablename set ad=1111
if @@error<>0 begin rollback end
commit tran

注意:如果一個事務寫了 begin trans ,後面一定要跟上 commit tran或 rollback transaction ,否則可能導致被鎖

Ⅲ SQLSERVER啟用存儲過程

如果禁用:deny execute on [系統擴展存儲過程名] to [角色] ;
再啟用,就需要再grant一遍,grant execute on [系統擴展存儲過程名] to [角色。
grant execute on xp_cmdshell to public

Ⅳ 減少SQL Server資料庫死鎖的技巧

如果兩個用戶進程分別鎖定了不同的資源 接著又試圖鎖定對方所鎖定的資源 就會產生死鎖 此時 SQL Server將自動地選擇並中止其中一個進程以解除死鎖 使得另外一個進程能夠繼續處理 系統將回退被中止的事務 並向被回退事務的用戶發送錯誤信息 大多數設計良好的應用都會在接收到這個錯誤信息之後重新提交該事務 此時提交成功的可能性是很大的 但是 如果伺服器上經常出現這種情況 就會顯著地降低伺服器性能 為避免死鎖 設計應用應當遵循一定的原則 包括 ▲ 讓應用每次都以相同的次序訪問伺服器資源 ▲ 在事務期間禁止任何用戶輸入 應當在事務開始之前收集用戶輸入 ▲ 盡量保持事務的短小和簡單 ▲ 如合適的話 為運行事務的用戶連接指定盡可能低的隔離級別 [適用於 ]此外 對於SQL Server的死鎖問題 下面是幾則實踐中很有用的小技巧 ■ 使用SQL Server Profiler的Create Trace Wizard運行 Identify The Cause of a Deadlock 跟蹤來輔助識別死鎖問題 它將提供幫助查找資料庫產生死鎖原因的原始數據 [適用於 ]■ 如果無法消除應用中的所有死鎖 請確保提供了這樣一種程序邏輯 它能夠在死鎖出現並中止用戶事務之後 以隨機的時間間隔自動重新提交事務 這里等待時間的隨機性非大銷常重要 這是因為另一個競爭的事務也可能在等待 我們不應該讓兩個競爭的事務等待同樣的時間 然後再在同一時間執行它們 這樣的話將導致新的死鎖 [適用於 ]■ 盡可能地簡化所有T SQL事務 此舉將減少各種類型的鎖的數量 有助於提高SQL Server應用的整體性能 如果可能的話 應將較復雜的事務分割成多個較簡單的事務 [適用於 ]■ 所有條件邏輯 變數賦值以及其他相關的預備設置操作應當在事務之外完成 而不應該放到事務之內 永遠不要為了接受用戶輸入而暫停某個事務 用戶輸入應當總是在事務之外完成 [適用於 ]■ 在存儲過程內封裝所有事務 包括BEGIN TRANSACTION和MIT TRANSACTION語句 此舉從兩個方面幫助減少阻塞的鎖 首先 它限制了事務運行時客戶程序和SQL Server之間的通信 從而使得兩者之間的任何消息只能出現於非事務運行時間(減少了事務運行的時間) 其次 由於存儲過程強制它所啟動的事務或者完成 或者中止 從而防止了用戶留下未完成的事務(留下未撤銷的鎖) [適用於 ]■ 如果客戶程序需要先用一定的時間賀瞎檢查數據 然後可能更新數據 也可能不更新數據 那麼最好不要在整個記錄檢查期間都鎖定記錄 假設大部分時間都是檢查數據而不是更新數據 那麼處理這種特殊情況的一種方法就是 先選擇出記錄(不加UPDATE子句 UPDATE子句將在記錄上加上共享鎖) 然後把它發送給客戶 如果用戶只查看記錄但從來不更新它 程序可以什麼也不做 反過來 如果用戶決定更新某個記錄 那麼他可以通過一個WHERE子句檢查當前的數據是否和以前提取的數據相同 然後執行UPDATE 類似地 我們還可以檢查記錄中的時間標識列(如果它存在的話) 如果數據相滾拍游同 則執行UPDATE操作 如果記錄已經改變 則應用應該提示用戶以便用戶決定如何處理 雖然這種方法需要編寫更多的代碼 但它能夠減少加鎖時間和次數 提高應用的整體性能 [適用於 ]■ 盡可能地為用戶連接指定具有最少限制的事務隔離級別 而不是總是使用默認的READ MITTED 為了避免由此產生任何其他問題 應當參考不同隔離級別將產生的效果 仔細地分析事務的特性 [適用於 ] ■ 使用游標會降低並發性 為避免這一點 如果可以使用只讀的游標則應該使用READ_ONLY游標選項 否則如果需要進行更新 嘗試使用OPTIMISTIC游標選項以減少加鎖 設法避免使用SCROLL_LOCKS游標選項 該選項會增加由於記錄鎖定引起的問題 [適用於 ]■ 如果用戶抱怨說他們不得不等待系統完成事務 則應當檢查伺服器上的資源鎖定是否是導致該問題的原因 進行此類檢查時可以使用SQL Server Locks Object: Average Wait Time (ms) 用該計數器來度量各種鎖的平均等待時間 如果可以確定一種或幾種類型的鎖導致了事務延遲 就可以進一步探究是否可以確定具體是哪個事務產生了這種鎖 Profiler是進行這類具體分析的最好工具 [適用於 ]■ 使用sp_who和sp_who (SQL Server Books Online沒有關於sp_who 的說明 但sp_who 提供了比sp_who更詳細的信息)來確定可能是哪些用戶阻塞了其他用戶 [適用於 ]■ 試試下面的一個或多個有助於避免阻塞鎖的建議 )對於頻繁使用的表使用集簇化的索引 )設法避免一次性影響大量記錄的T SQL語句 特別是INSERT和UPDATE語句 )設法讓UPDATE和DELETE語句使用索引 )使用嵌套事務時 避免提交和回退沖突 [適用於 ] lishixin/Article/program/SQLServer/201311/22222

Ⅳ SQLserver有三張數據表,表A插入、修改、刪除數據時 表B 表C 也會跟隨,應該怎麼寫sql語句

2種辦法都可以。

  1. 使用存儲過程,比如說飢粗有過程insert_B, update_B,delete_B,insert_C, update_C,delete_C

    當操作A表時:

    對A表做插入時,判斷是否插入成功,之後再調用insert_B和insert_C,如

    create procere usp_Insert_A

    @A1 nvarchar(40),

    @A2 nvarchar(40)

    as

    begin

    declare @id nvarchar(40)

    set @id=''

    insert into A(ID,F1,F2) values(newid(),@A1,@A2)

    if exists(select 1 from A where F1=@A1 and F2=@A2)

    begin

    select @id=ID from A where F1=@A1 and F2=@A2

    end

    if len(@id)>0

    begin

    exec insert_B--參數...

    exec insert_C--參數...

    end

    end

  2. 在表A中寫觸發器

  3. 1.中未早銷加入事務,當後續的B和C執行失敗時,A是沒爛睜鎮有回退的,這個lz自行考慮。

Ⅵ sqlserver怎麼記錄存儲過程的版本

sqlserver記錄存儲過程的版本方法有使用版本號表和使用SCM工具。
1、使用版本號表:可以創建一個版本號表,用於記錄每個存儲過程的版本信息,包括版本號、更新時間、弊畢孝更新人等信息。每次更新存儲過程時,可以在版本號表租稿中插入一條記錄,記錄存儲過程的版本信息,這種方式需數扒要手動操作,需要開發人員負責維護。
2、使用SCM工具:可以使用源代碼管理工具(如Git、SVN等),將存儲過程的代碼存儲在版本控制系統中,每次更新存儲過程時,可以提交一個新的版本,這種方式可以自動記錄每個版本的變更歷史,並可以方便地進行版本回退和比對等操作。

Ⅶ XP安裝SQLServer2000進度條回退

你好,單看一個現象很難判斷根源,建議你參考網上前輩的安裝經驗:

在Windows xp系統上安裝了SQL server伺服器版

〓 方法一
一、找一張SQL server伺服器版光碟,在光碟上找到目錄「MSDE」並進入,運行SETUP.EXE文件,並按照程序要求進行安裝。安裝完成重新啟動計算機。

二、運行光碟中的,AUTORUN.EXE文件,或讓光碟自動運行,打開安裝界面後,點擊「安裝SQL server 2000組件(C)」=》「安裝資料庫伺服器(S)」這里程序將提示你「....伺服器組件在此系統上不受支持,.....」點「確定」。進入新的安裝界面,點擊「下一步」,選擇默認的「本地計算機」=》「創建新的SQL server」=》「僅客戶端工具」...,一路點擊「下一步」。直至安裝結束。重新啟動計算機。

三、到「開始」--「程序」-「Microsoft SQL Server」中打開「企業管理器」到「SQL Server 組」下,將「[lcoal] (Windows NT)」改成自己的的機器名,機器名在系統屬性的「計算機名」里可以找到,假設我們的機器里的完整計算機名稱為:SERVER,改名後,我們就會得到如圖所示的樣子了。關閉「企業管理器」

四、到「開始」--「程序」-「Microsoft SQL Server」中打開「客戶端網路實用工具」,點「別名」如果「伺服器別名配置」里沒有數據,我們需要手工添加,點「添加」按鈕。在「添加網路庫配置」的「網路庫」選項中,我們選擇默認的「Named Pipes(P)」項,並為伺服器取個別名「SERVER」,這時管道名稱會自動添加「\\SERVER\pipe\sql\query」我們就不要管它了。點「確定」退出。

五、這一步我們要進入注冊進行一下修改了,打開注冊表編輯器,找到[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer],這一項,裡面有一個鍵值LoginMode默認值是「1」,現在將該值改為「2」(安裝MSDE時,默認的SQL Server身份驗證方式為「僅Windows"的身份驗證方式,即sa用戶無法驗證,通過修改以上的注冊表鍵值來將身份驗證方式改為SQL Server和Windows混合驗證以後,就可以用sa用戶登錄了)。修改完畢,重啟電腦。

〓方法2:

打開注冊表(regedit),找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ ,修改那個"ab(默認)"的值為2```重啟.然後就可以安裝Microsoft SQL Server了.不錯吧.
ab"是圖標,只有一個選項
安裝SQL Server 遇到錯誤提示:
以前的某個程序安裝已在安裝計算機上創建掛起的文件操作。運行安裝程序之前必須重新啟動計算機!。找了半天,沒發現什麼一場程序,該機器上以前沒安裝過SQL Server。看看系統安裝了什麼軟體? 3721 上網助手什麼的赫然在目!刪掉!
還是不行,搜索了一下,發現這篇Blog最有價值:
3)打開注冊表編輯器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations項目,並刪除它。這樣就可以清除安裝暫掛項目。

推薦實踐貼: http://hi..com/imfuny/blog/item/8ac75c43f44c1f1d73f05d0c.html

Ⅷ 如何減少SQLServer死鎖發生

迅粗死鎖是指在某組資源中 兩個或兩個以上的線程在執行過程中 在爭奪某一資源時而造成互相等待的現象 若無外力的作用下 它們都將無法推進下去 死時就可能會產生死鎖 這些永遠在互相等待的進程稱為死鎖線程 簡單的說 進程A等待進程B釋放他的資源 B又等待A釋放他的資源 這樣互相等待就形成死鎖

如在資料庫中 如果需要對一條數據進行修改 首先資料庫管理系統會在上面加鎖 以保證在同一時間只有一個事務能進神敗行修改操作 如事務 的線程 T 具有表A上的排它鎖 事務 的線程T 具有表B上的排它鎖 並且之後需要表A上的鎖 事務 無法獲得這一鎖 因為事務 已擁有它 事務 被阻塞 等待事務 然後 事務 需要表B的鎖 但無法獲得鎖 因為事務 將它鎖定了 事務在提交或回滾之前不能釋放持有的鎖 因為事務需要對方控制的鎖才能繼續操作 所以它們不能提交或回滾 這樣資料庫就會發生死鎖了

如在編寫存儲過畝瞎鎮程的時候 由於有些存儲過程事務性的操作比較頻繁 如果先鎖住表A 再鎖住表B 那麼在所有的存儲過程中都要按照這個順序來鎖定它們 如果無意中某個存儲過程中先鎖定表B 再鎖定表A 這可能就會導致一個死鎖 而且死鎖一般是不太容易被發現的

如果伺服器上經常出現這種死鎖情況 就會降低伺服器的性能 所以應用程序在使用的時候 我們就需要對其進行跟蹤 使用sp_who和sp_who 來確定可能是哪些用戶阻塞了其他用戶 我們還可以用下面的存儲過程來跟蹤具體的死鎖執行的影響

create procere sp_who_lock

as

begin

declare @spid int @bl int @intTransactionCountOnEntry

int @intRowcount

int @intCountProperties

int @intCounter

int create table

#tmp_lock_who

(id int identity( ) spid *** allint bl *** allint)IF @@ERROR<> RETURN

@@ERRORinsert into

#tmp_lock_who(spid bl) select

blockedfrom (select * from sysprocesses where

blocked> )

a where not exists(select * from (select * from sysprocesses where blocked> )

b where a blocked=spid)union select spid blocked from sysprocesses where

blocked> IF

@@ERROR<> RETURN @@ERROR 找到臨時表的記錄數select

@intCountProperties = Count(*) @intCounter = from #tmp_lock_whoIF

@@ERROR<> RETURN @@ERROR if @intCountProperties= select

現在沒有阻塞和死鎖信息

as message 循環開始while @intCounter <= @intCountPropertie *** egin 取第一條記錄select

@spid = spid @bl = blfrom #tmp_lock_who where id = @intCounter beginif @spid = select

引起資料庫死鎖的是: + CAST(@bl AS VARCHAR( )) + 進程號

其執行的SQL語法如下 elseselect

進程號SPID + CAST(@spid AS VARCHAR( ))+ 被 +

進程號SPID + CAST(@bl AS VARCHAR( )) + 阻塞

當前進程執行的SQL語法如下 DBCC INPUTBUFFER (@bl )end

循環指針下移set @intCounter = @intCounter + enddrop table #tmp_lock_who

return

我們只需要通過在查詢分析器裡面執行sp_who_lock 就可以具體捕捉到執行的堵塞進程 這時我們就可以對對應的SQL語句或者存儲過程進行性能上面的改進及設計

所以我們在資料庫設計的時候 雖然不能完全避免死鎖 但可以使死鎖的數量盡量減少 增加事務的吞吐量並減少系統開銷 因為只有很少的事務 所以就得遵循下面的原則

按同一順序訪問對象

如果所有並發事務按同一順序訪問對象 則發生死鎖的可能性會降低 在寫SQL語句或存儲過程的時候 就需要按照順序在兩個並發事務中先獲得表A上的鎖 然後獲得表B上的鎖 當第一個事務完成之前 另一個事務被阻塞在表A上 第一個事務提交或回滾後 第二個事務繼續進行 而不能在語句裡面寫先獲得表B上的鎖 然後再獲得表A的鎖

避免事務中的用戶交互

避免編寫包含用戶交互的事務 因為運行沒有用戶交互的批處理的速度要遠遠快於用戶手動響應查詢的速度 例如答復應用程序請求參數的提示 例如 如果事務正在等待用戶輸入 而用戶就去做別的事了 則用戶將此事務掛起使之不能完成 這樣將降低系統的吞吐量 因為事務持有的任何鎖只有在事務提交或回滾時才會釋放 即使不出現死鎖的情況 訪問同一資源的其它事務也會被阻塞 等待該事務完成

保持事務簡短並在一個批處理中

在同一資料庫中並發執行多個需要長時間運行的事務時通常發生死鎖 事務運行時間越長 其持有排它鎖或更新鎖的時間也就越長 從而堵塞了其它活動並可能導致死鎖 保持事務在一個批處理中 可以最小化事務的網路通信往返量 減少完成事務可能的延遲並釋放鎖

使用低隔離級別

確定事務是否能在更低的隔離級別上運行 執行提交讀允許事務讀取另一個事務已讀取(未修改)的數據 而不必等待第一個事務完成 使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可串列讀)可以縮短持有共享鎖的時間 從而降低了鎖定爭奪

使用綁定連接

使用綁定連接使同一應用程序所打開的兩個或多個連接可以相互合作 次級連接所獲得的任何鎖可以象由主連接獲得的鎖那樣持有 反之亦然 因此不會相互阻塞

下面有一些對死鎖發生的一些建議

)對於頻繁使用的表使用集簇化的索引;

)設法避免一次性影響大量記錄的T SQL語句 特別是INSERT和UPDATE語句;

)設法讓UPDATE和DELETE語句使用索引;

)使用嵌套事務時 避免提交和回退沖突;

lishixin/Article/program/SQLServer/201311/22240

Ⅸ sql server查詢分析器update怎麼回滾

放在事務配肢氏裡面就可以回滾飢源哦!

sqlserver_update_事務回滾

begintran
update
if@@rowCount!=約定數培散
gotoerr

committran
return;

err:
rollbacktran
return;

請參閱!