1. 程式人生 > >執行儲存過程超時 SQL

執行儲存過程超時 SQL

     在執行儲存過程時,我們常遇到執行超時的情況。

     如果是因為要處理的資料過多,修改流程複雜等原因的話,如以用以下方法解決:

     在儲存過程的處理工作中加上事務管理:

    SET   TRANSACTION   ISOLATION   LEVEL   REPEATABLE   READ     --->要這行  
     BEGIN   TRAN   

          /* 這裡是程式處理程式碼段*/

    commit   transaction           
    QuitWithRollback:  
    IF   (@@TRANCOUNT   >   0)    
    BEGIN  
        ROLLBACK   TRANSACTION    
    END

以下是事務相關的知識:

BEGIN TRANSACTION--開始事務

DECLARE @errorSun INT --定義錯誤計數器

SET @errorSun=0 --沒錯為0

UPDATE a SET id=232 WHERE a=1 --事務操作SQL語句

SET @[email protected][email protected]@ERROR --累計是否有錯

UPDATE aa SET id=2 WHERE a=1 --事務操作SQL語句

SET @[email protected][email protected]@ERROR --累計是否有錯

IF @errorSun<>0 BEGIN PRINT '有錯誤,回滾'

ROLLBACK TRANSACTION--事務回滾語句

END ELSE BEGIN PRINT '成功,提交'

COMMIT TRANSACTION--事務提交語句

END

1.什麼是事務:事務是一個不可分割的工作邏輯單元,在資料庫系統上執行併發操作時事務是做為最小的控制單元來使用的。他包含的所有資料庫操作命令作為一個整體一起向系提交或撤消,這一組資料庫操作命令要麼都執行,要麼都不執行。

2.事務的語句 開始事物:BEGIN TRANSACTION  提交事物:COMMIT TRANSACTION  回滾事務:ROLLBACK TRANSACTION

3.事務的4個屬性

①原子性(Atomicity):事務中的所有元素作為一個整體提交或回滾,事務的個元素是不可分的,事務是一個完整操作。

②一致性(Consistemcy):事物完成時,資料必須是一致的,也就是說,和事物開始之前,資料儲存中的資料處於一致狀態。保證資料的無損。

③隔離性(Isolation):對資料進行修改的多個事務是彼此隔離的。這表明事務必須是獨立的,不應該以任何方式以來於或影響其他事務。

④永續性(Durability):事務完成之後,它對於系統的影響是永久的,該修改即使出現系統故障也將一直保留,真實的修改了資料庫

4.事務的儲存點 SAVE TRANSACTION 儲存點名稱 --自定義儲存點的名稱和位置 ROLLBACK TRANSACTION 儲存點名稱 --回滾到自定義的儲存點 二事例 所謂事務是指一組邏輯操作單元,它使資料從一種狀態變換到另一種狀態。包括四個特性:

1、原子性 就是事務應作為一個工作單元,事務處理完成,所有的工作要麼都在資料庫中儲存下來,要麼完全回滾,全部不保留

2、一致性 事務完成或者撤銷後,都應該處於一致的狀態

3、隔離性 多個事務同時進行,它們之間應該互不干擾.應該防止一個事務處理其他事務也要修改的資料時, 不合理的存取和不完整的讀取資料

4、永續性 事務提交以後,所做的工作就被永久的儲存下來 示例:建立一個儲存過程,向兩個表中同時插入資料

Create proc RegisterUser

(

@usrName varchar(30),

@usrPasswd varchar(30),

@age int,@sex varchar(10),

@PhoneNum varchar(20),

@Address varchar(50) )

as begin

begin tran

insert into userinfo(userName,userPasswd)

values(@usrName,@usrPasswd)

if @@error<>0

begin rollback tran

return -1

end

insert into userdoc(userName,age,sex,PhoneNumber,Address)

values(@Usrname,@age,@sex,@PhoneNum,@Address)

if @@error<>0

begin rollback tran

return -1

end

commit tran

return 0

end

    事務的分類按事務的啟動與執行方式,可以將事務分為3類:

顯示事務 也稱之為使用者定義或使用者指定的事務,即可以顯式地定義啟動和結束的事務。分散式事務屬於顯示事務自動提交事務預設事務管理模式。如果一個語句成功地完成,則提交該語句;如果遇到錯誤,則回滾該語句。

隱性事務當連線以此模式進行操作時,sql將在提交或回滾當前事務後自動啟動新事務。無須描述事務的開始,只需提交或回滾每個事務。它生成連續的事務鏈。

一、顯示事務通過begin transacton、commit transaction、commit work、rollback transaction或rollback work等語句完成。

1、啟動事務格式:begin tran 事務名或變數 with mark 描述

2、結束事務格式:commit tran 事務名或變數 (事務名與begin tran中的事務名一致或commit work 但此沒有引數

3、回滾事務 rollback tran 事務名或變數 | savepoint_name | savepoint_variable 或rollback work 說明:清除自事務的起點或到某個儲存點所做的所有資料修改

4、在事務內設定儲存點格式:save tran savepoint_name | savepoint_variable 示例:

use bookdb

go

begin tran mytran

insert into book values(9,"windows2000',1,22,'出版社')

save tran mysave

delete book where book_id=9

rollback tran mysave

commit tran

go

select * from book

go

可以知道,上面的語句執行後,在book中插入了一筆記錄,而並沒有刪除。因為使用rollback tran mysave 語句將操作回滾到了刪除前的儲存點處。

5、標記事務格式:with mark 例:使用資料庫標記將日誌恢復到預定義時間點的語句 在事務日誌中置入一個標記。請注意,被標記的事務至少須提交一個更新,以標記該日誌。

BEGIN TRAN MyMark WITH MARK UPDATE pubs.dbo.LastLogMark SET MarkTime = GETDATE() COMMIT TRAN MyMark 按照您常用的方法備份事務日誌。

BACKUP LOG pubs TO DISK='C:/Backups/Fullbackup.bak' WITH INIT 現在您可以將資料庫恢復至日誌標記點。首先恢復資料庫,並使其為接受日誌恢復做好準備。 RESTORE DATABASE pubs FROM DISK=N'C:/Backups/Fullbackup.bak' WITH NORECOVERY 現在將日誌恢復至包含該標記的時間點,並使其可供使用。請注意,STOPAT在資料庫正在執行大容量日誌時禁止執行。 RESTORE LOG pubs FROM DISK=N'C:/Backups/Logbackup.bak' WITH RECOVERY, STOPAT='02/11/2002 17:35:00'

5、不能用於事務的操作建立資料庫 create database 修改資料庫 alter database 刪除資料庫 drop database 恢復資料庫 restore database 載入資料庫 load database 備份日誌檔案 backup log 恢復日誌檔案 restore log 更新統計資料 update statitics 授權操作 grant 複製事務日誌 dump tran 磁碟初始化 disk init 更新使用sp_configure後的系統配置 reconfigure

二、自動提交事務 sql連線在begin tran 語句啟動顯式事務,或隱性事務模式設定為開啟之前,將以自動提交模式進行操作。當提交或回滾顯式事務,或者關閉隱性事務模式時,將返回到自動提交模式。示例: 由於編譯錯誤,使得三個insert都沒執行

use test

go

create table testback(cola int primary key ,colb char(3))

go

insert into testback values(1,'aaa')

insert into testback values(2,'bbb')

insert into testback value(3,'ccc')

go

select * from testback

go 沒有任何結果返回

三、隱式事務通過 API 函式或 Transact-SQL SET IMPLICIT_TRANSACTIONS ON 語句,將隱性事務模式設定為開啟。下一個語句自動啟動一個新事務。當該事務完成時,再下一個 Transact-SQL 語句又將啟動一個新事務。當有大量的DDL 和DML命令執行時會自動開始,並一直保持到使用者明確提交為止,切換隱式事務可以用SET IMPLICIT_TRANSACTIONS 為連線設定隱性事務模式.當設定為 ON 時,SET IMPLICIT_TRANSACTIONS 將連線設定為隱性事務模式。當設定為 OFF 時,則使連線返回到自動提交事務模式 語句包括: alter table insert open create delete revoke drop select fetch truncate table grant update 示例: 下面使用顯式與隱式事務。它使用@@tracount函式演示開啟的事務與關閉的事務:

use test

go

set nocount on

create table t1(a int)

go

insert into t1 values(1)

go

print '使用顯式事務'

begin tran

insert into t1 values(2)

print '事務外的事務數目:'+cast(@@trancount as char(5))

commint tran

print '事務外的事務數目:'+cast(@@trancount as char(5))

go

print

go

set implicit_transactions on go print '使用隱式事務'

go

insert into t1 values*4)

print'事務內的事務數目:'+cast(@@trancount as char(5))

commint tran print'事務外的事務數目:'+cast(@@trancount as char(5))

go

執行結果: 使用顯示事務事務內的事務數目:2 事務外的事務數目:1 使用隱式事務事務內的事務數目:1 事務外的事務數目:0

四、分散式事務跨越兩個或多個數據庫的單個sql server中的事務就是分散式事務。與本地事務區別:必須由事務管理器管理,以儘量避免出現因網路故障而導致一個事務由某些資源管理器成功提交,但由另一些資源管理器回滾的情況。 sql server 可以由DTc microsoft distributed transaction coordinator 來支援處理分散式事務,可以使用 BEgin distributed transaction 命令啟動一個分散式事務處理 分二階段:

A 準備階段 B 提交階段

執行教程:

1、sql 指令碼或應用程式連線執行啟動分散式事務的sql語句

2、執行該語句的sql在為事務中的主控伺服器

3、指令碼或應用程式對連結的伺服器執行分散式查詢,或對遠端伺服器執行遠端儲存過程。

4、當執行了分散式查詢或遠端過程呼叫後,主控伺服器將自動呼叫msdtc以便登記分散式事務中連結的伺服器和遠端伺服器

5、當指令碼或應用程式發出commit或rollback語句時,主控sql將呼叫msdtc管理兩階段提交過程,或者通知連結的伺服器和遠端伺服器回滾其事務。

相關推薦

執行儲存過程超時 SQL

     在執行儲存過程時,我們常遇到執行超時的情況。      如果是因為要處理的資料過多,修改流程複雜等原因的話,如以用以下方法解決:      在儲存過程的處理工作中加上事務管理:     SET   TRANSACTION   ISOLATION   LEVEL 

sql計算時間差執行儲存過程

<pre name="code" class="sql">-- datediff( day, '比較時間', GETDATE() )DECLARE @ctime INT SELECT @c

pl/sql sql 執行儲存過程,帶時間引數例子。

select PKG_SAI_GC_AGENTASSESS.f_calStandardPrem('2040000027',                                                

sqlserver儲存過程拼接sql語句,執行報錯“列名無效”

今天寫儲存過程,遇到一個問題,具體如下:需求是要統計一張報表,這張表的列不固定,因此在儲存過程裡做插入語句的時候,就用到了sql語句拼接再執行。這裡拼接的insert語句是set @sql= 'insert into ##tn(prj) values('[email 

轉!mysql 命令列下 通過DELIMITER臨時改變語句分隔符 執行儲存過程

mysql 在 Navicat 介面工具 執行儲存過程ok,但是在命令列下執行失敗。 原因在於,預設的MySQL語句分隔符為' ; ',在輸入' ; '的時候,“以為”語句已經結束了,但實際上語句還沒有結束。 解決方案:使用DELIMITER臨時改變命令列的語句分隔符,在儲存過程建立之後再修改分隔符為原來

執行儲存過程,報錯提示 找不到儲存過程

原因: SQL Server 客戶端, 在連線到 SQL Server 資料庫以後。會自動讀取 資料庫的 資料字典資訊。也就是 當前資料庫,有哪些表/欄位/檢視/儲存過程等基礎資訊。儲存在客戶端的記憶體裡面。這樣。當你在客戶端輸入 SQL 語句的時候,輸入 表名字.會自動彈出 這個表的欄位列表,

mysql 儲存過程動態sql

DROP PROCEDURE IF EXISTS PRO_STA_SYSTEM_ORDER_STATE; DELIMITER // CREATE DEFINER=`root`@`%` PROCEDURE `PRO_STA_SYSTEM_ORDER_STATE`(OUT O_RESULT_

執行儲存過程時,返回引數示例程式碼

//引數 SqlParameter[] fparams = new SqlParameter[7]; fparams[0] = new SqlParameter("@ID", ID); fparams[

MySQL-SQLyog執行儲存過程儲存函式等

1.開啟SQLyog在目錄樹-函式(儲存過程)資料夾上右鍵,建立函式(建立儲存過程) 2.按照MySQL定義函式的規則,新定義一個函式:   3. 然後新建查詢編輯器,呼叫自定義的函式。 命令:SELECT function_name(params1, ...),函式名稱

SQLSERVER 連結伺服器執行儲存過程

1.建立連結伺服器 exec sp_addlinkedserver 'server_tmp','','SQLOLEDB','192.168.1.1' -- server_tmp 為別名 exec sp_addlinkedsrvlogin 'server_tmp','false',null,'sa','

Oracle job 定時執行 儲存過程

一:簡單測試job的建立過程案例: 1,先建立一張JOB_TEST表,欄位為a 日期格式 SQL> create table JOB_TEST(a date); Table created SQL> commit; Commit complete

oracle帶輸入輸出引數儲存過程(包括sql分頁功能)

記錄一下,免得以後忘記了又要到處去找。 begin /*這裡不能直接執行select語句但可以直接執行update、delete、insert語句*/ end裡面不能接執行select語句,宣告會話級臨時表必須有“execute immediate 'TRUNCATE TABLE 表名';”這一句不然其他的s

thinkphp5 連線 SqlServer 執行儲存過程,返回為空解決方案

專案做在win下,伺服器是類似空間伺服器,所以不可以裝擴充套件,只能yum 老闆又非要用雙資料庫(sqlsever 心酸里程) ,結果就是伺服器sqlsrv 不可用,裝的是dblib  ......云云雲 水準不高 ,只能用最簡單的方法 。 貼程式碼記錄一下,返回結果成功

定時執行儲存過程

需求:客戶要求把A系統出來的一些資料每月底同步到指定表(在A系統資料庫)中。 實現方案:往指定表插資料採用儲存過程(procA)。每月底執行採用windows任務定時或“SQL Server代理——作業”實現。 怎麼使用windows自帶任務定時執行bat實現上述需求? 1、先建

oracle執行儲存過程返回遊標cursor

create or replace procedure TEST(s varchar2, r_result out sys_refcursor) is   --作者:lml   --功能:根據tokenid查詢放行指令   --詳情:   --1.返回放行指令   --時間

儲存過程&函式-sql

以一下例子以mysql為例: 儲存過程函式函式 函式建立: 需要參入引數user_id是intBEGIN DECLARE ss varchar(100); set ss='aaa'; select name into ss from testuser wher

sybase執行儲存過程的方法

如題第一種: 如果安裝了dba客戶端的話,開啟isql查詢分析器: 輸入helloworld '2012-4-8','2012-4-9',0 結果: 注意這是有引數的儲存過程,由於受mysql、影響我剛剛是這樣輸入的helloworld ('2012-4-8','2012-

PLsql中執行儲存過程的方法

1、在sqlplus命令列介面使用"EXECUTE"命令(簡寫做"EXEC")執行[email protected]> exec proc_helloworldHello World!PL/SQL procedure successfully complet

Oracle如何執行儲存過程

示例:有如下建立索引的儲存過程 --procedure create_index create or replace procedure create_index(indexName in varch

怎麼在plsql中執行儲存過程

1寫一個簡單的儲存過程 CREATE OR REPLACE PROCEDURE aaa(rs_cursor out TYPES.REFCURSOR)  AS BEGIN open rs_cursor for select *  from user; END; 2在plsq