存儲過程和事務(wù)的區(qū)別
存儲過程和事務(wù)的區(qū)別想必很多人都不是很了解,一起來看看吧。下面是學(xué)習(xí)啦小編給大家整理的存儲過程和事務(wù)的區(qū)別,供大家參閱!
存儲過程和事務(wù)的區(qū)別
存儲過程:是SQL-Server服務(wù)器上一組預(yù)先編譯好的T-SQL語句。以一個(gè)名稱存儲在數(shù)據(jù)庫中,作為一個(gè)獨(dú)立的數(shù)據(jù)庫對象。
有以下優(yōu)點(diǎn):
1、執(zhí)行速度快;
2、提高工作效率;
3、規(guī)范程序設(shè)計(jì);
4、提高系統(tǒng)安全性。
事務(wù):一般是指用戶定義的一序列操作,這些操作要么全做,要么都不做,是不可分割的一個(gè)工作單位.他是一個(gè)邏輯工作單元,同時(shí)又是一個(gè)恢復(fù)單元,一個(gè)事務(wù)提交以后數(shù)據(jù)庫又處與另一個(gè)一致狀態(tài).具體的關(guān)于他的操作去找書看吧.
事務(wù)中可以有存儲過程
存儲過程中也可以有事務(wù)
事務(wù)是一系列的對數(shù)據(jù)庫的操作,這些操作包括存儲過程,更改語句及其它操作。開始語句是BEGIN TRANSACTION (事務(wù)開始),結(jié)束語句有兩種,一個(gè)是ROLLBACK--回滾,一個(gè)是--commit提交事務(wù)的所有操作。
存儲過程是實(shí)現(xiàn)一定功能的語句組成的程序段??梢园ㄊ聞?wù),也可以在某事務(wù)當(dāng)中。
這是一個(gè)包括一個(gè)事務(wù)處理過程的存儲過程,并且在事務(wù)中也包括另一個(gè)存儲過程的操作:
CREATTE PROCEDURE MYPROCEDURE
AS
BEGIN TRANSACTION--開始一個(gè)事務(wù)
UPDATE TABLENAME SET ABC='DEF' WHERE ......--操作
EXEC OTHERPROCEDURE '參數(shù)' --事務(wù)中包括的存儲過程
IF @@ERROR>0--操作如果失敗
BEGIN
ROLLBACK TRANSACTION--回滾
RAISERROR('更改數(shù)據(jù)失敗!',16,1)--向前臺報(bào)錯(cuò)
RETURN--返回,不再繼續(xù)執(zhí)行
END
ELSE
COMMIT TRANSACTION--操作成功,確認(rèn)所作修改
GO
存儲過程的優(yōu)勢
(1) 能實(shí)現(xiàn)模塊化程序設(shè)計(jì)。存儲過程是根據(jù)實(shí)際功能的需要創(chuàng)建的一個(gè)程序模塊,并被存儲在數(shù)據(jù)庫中。以后用戶要完成該功能,只要在程序中直接調(diào)用該存儲過程即可,而無需再編寫重復(fù)的程序代碼。存儲過程可由數(shù)據(jù)庫編程方面的專門人員創(chuàng)建,并可獨(dú)立于程序源代碼而進(jìn)行修改和擴(kuò)展。
(2) 使用存儲過程可以提高執(zhí)行效率。當(dāng)客戶程序需要訪問服務(wù)器上的數(shù)據(jù)時(shí),一般要經(jīng)過5個(gè)步驟:
● 查詢語句被發(fā)送到服務(wù)器;
● 服務(wù)器編譯T-SQL語句;
● 優(yōu)化產(chǎn)生查詢執(zhí)行計(jì)劃;
● 數(shù)據(jù)庫引擎執(zhí)行查詢;
● 執(zhí)行結(jié)果發(fā)回客戶程序。
如果執(zhí)行存儲在客戶端本地的T-SQL程序,那么每次執(zhí)行該程序時(shí),對于程序中的每一條語句都要經(jīng)過以上5個(gè)步驟。而存儲過程在創(chuàng)建時(shí)就被編譯和優(yōu)化,當(dāng)存儲過程第一次被執(zhí)行時(shí),SQL Server為其產(chǎn)生查詢計(jì)劃并將其保存在內(nèi)存中,這樣以后在調(diào)用該存儲過程時(shí)就不必再進(jìn)行編譯,即以上5個(gè)步驟中的第2步和第3步就被省略了,這能大大改善系統(tǒng)的性能。
(3) 減少網(wǎng)絡(luò)流量。一個(gè)需要數(shù)百行T-SQL代碼的操作,如果將其創(chuàng)建成存儲過程,那么使用一條調(diào)用存儲過程的語句就可完成該操作。這樣就可避免在網(wǎng)絡(luò)上發(fā)送數(shù)百行代碼,從而減少了網(wǎng)絡(luò)負(fù)荷。
(4) 可作為安全機(jī)制使用。管理員可以不授予用戶訪問存儲過程中涉及的表的權(quán)限,而只授予執(zhí)行存儲過程的權(quán)限。這樣,既可以保證用戶通過存儲過程操縱數(shù)據(jù)庫中的數(shù)據(jù),又可以保證用戶不能直接訪問存儲過程中涉及的表。用戶通過存儲過程來訪問表,所能進(jìn)行的操作是有限制的,從而保證了表中數(shù)據(jù)的安全性。
存儲過程的類型
(1) 系統(tǒng)存儲過程
在SQL Server中的許多管理工作是通過執(zhí)行系統(tǒng)存儲過程來完成的。系統(tǒng)存儲過程創(chuàng)建和保存在master數(shù)據(jù)庫中,都以sp_為名稱的前綴。系統(tǒng)存儲過程是SQL Server系統(tǒng)自帶的,具有執(zhí)行系統(tǒng)存儲過程權(quán)限的用戶,可在master數(shù)據(jù)庫之外直接調(diào)用。一般情況下,系統(tǒng)存儲過程執(zhí)行成功返回0值,若有錯(cuò)誤發(fā)生返回非0值。
(2) 擴(kuò)展存儲過程
擴(kuò)展存儲過程是以動態(tài)鏈接庫(dll)形式存在的外部程序。SQL Server自身帶了大量的擴(kuò)展存儲過程安裝在master數(shù)據(jù)庫中,擴(kuò)展存儲過程與普通存儲過程執(zhí)行方法相同。
若擴(kuò)展存儲過程的前綴為sp_,則該擴(kuò)展存儲過程在master數(shù)據(jù)庫之外也可直接調(diào)用;否則,必須在擴(kuò)展存儲過程前面加上“master.dbo.”前綴。開發(fā)人員可以使用其他編程語言來創(chuàng)建擴(kuò)展存儲過程,編寫好擴(kuò)展存儲過程后,可由sysadmin服務(wù)器角色的成員在 SQL Server 中注冊該擴(kuò)展存儲過程,然后授予其他用戶執(zhí)行該過程的權(quán)限。擴(kuò)展存儲過程只能添加到 master 數(shù)據(jù)庫中,利用擴(kuò)展存儲過程可以擴(kuò)展SQL Server的功能。
(3) 用戶存儲過程
用戶存儲過程是由用戶根據(jù)實(shí)際問題的需要所創(chuàng)建的存儲過程。固定服務(wù)器角色sysadmin 的成員可根據(jù)實(shí)際需要在master數(shù)據(jù)庫中創(chuàng)建用戶存儲過程,若使用sp_做存儲過程的前綴,則該存儲過程在任何位置均可直接調(diào)用,否則,必須在該存儲過程前面加上“master.dbo.”前綴。對于在用戶數(shù)據(jù)庫中創(chuàng)建的存儲過程,最好不要使用sp_作為其名稱的前綴,否則如果該存儲過程與系統(tǒng)存儲過程同名,則該存儲過程永遠(yuǎn)不會被執(zhí)行。并且若在該用戶數(shù)據(jù)庫之外調(diào)用該存儲過程,也必須在存儲過程名的前面加上“用戶數(shù)據(jù)庫名.所有者名.”前綴才能找著、執(zhí)行該存儲過程。
存儲過程和事務(wù)的區(qū)別相關(guān)文章: