日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

MS-SQL中的事务

發布時間:2024/6/5 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MS-SQL中的事务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 事務的屬性 事務具有ACID屬性 即 Atomic原子性, Consistent一致性, Isolated隔離性, Durable永久性原子性就是事務應作為一個工作單元,事務處理完成,所有的工作要么都在數據庫中保存下來,要么完全 回滾,全部不保留一致性 事務完成或者撤銷后,都應該處于一致的狀態隔離性多個事務同時進行,它們之間應該互不干擾.應該防止一個事務處理其他事務也要修改的數據時, 不合理的存取和不完整的讀取數據永久性 事務提交以后,所做的工作就被永久的保存下來二 事務并發處理會產生的問題丟失更新當兩個或多個事務選擇同一行,然后基于最初選定的值更新該行時,會發生丟失更新問題、 每個事務都不知道其它事務的存在。最后的更新將重寫由其它事務所做的更新,這將導致數據丟失。臟讀 當第二個事務選擇其它事務正在更新的行時,會發生未確認的相關性問題。 第二個事務正在讀取的數據還沒有確認并且可能由更新此行的事務所更改。不可重復讀當第二個事務多次訪問同一行而且每次讀取不同的數據時,會發生不一致的分析問題。 不一致的分析與未確認的相關性類似,因為其它事務也是正在更改第二個事務正在讀取的數據。 然而,在不一致的分析中,第二個事務讀取的數據是由已進行了更改的事務提交的。而且,不一致的分析涉及多次(兩次或更多)讀取同一行,而且每次信息都由其它事務更改;因而該行被非重復讀取。幻像讀當對某行執行插入或刪除操作,而該行屬于某個事務正在讀取的行的范圍時,會發生幻像讀問題。 事務第一次讀的行范圍顯示出其中一行已不復存在于第二次讀或后續讀中,因為該行已被其它事務刪除。同樣,由于其它事務的插入操作,事務的第二次或后續讀顯示有一行已不存在于原始讀中。三 事務處理類型自動處理事務系統默認每個T-SQL命令都是事務處理 由系統自動開始并提交隱式事務當有大量的DDL 和DML命令執行時會自動開始,并一直保持到用戶明確提交為止, 切換隱式事務可以用SET IMPLICIT_TRANSACTIONS 為連接設置隱性事務模式. 當設置為 ON 時,SET IMPLICIT_TRANSACTIONS 將連接設置為隱性事務模式。 當設置為 OFF 時,則使連接返回到自動提交事務模式用戶定義事務由用戶來控制事務的開始和結束 命令有: begin tran commit tran rollback tran 命令分布式事務 跨越多個服務器的事務稱為分布式事務,sql server 可以由DTc microsoft distributed transaction coordinator 來支持處理分布式事務,可以使用 BEgin distributed transaction 命令啟動一個分布式事務處理四 事務處理的隔離級別使用SET TRANSACTION ISOLATION LEVEL來控制由連接發出的所有語句的默認事務鎖定行為從低到高依次是READ UNCOMMITTED執行臟讀或 0 級隔離鎖定,這表示不發出共享鎖,也不接受排它鎖。當設置該選項時,可以對數據執行未提交讀或臟讀;在事務結束前可以更改數據內的數值,行也可以出現在數據集中或從數據集消失。該選項的作用與在事務內所有語句中的所有表上設置 NOLOCK 相同。這是四個隔離級別中限制最小的級別。舉例設table1(A,B,C) A B C a1 b1 c1 a2 b2 c2 a3 b3 c3新建兩個連接 在第一個連接中執行以下語句 select * from table1 begin tran update table1 set c='c' select * from table1 waitfor delay '00:00:10' --等待10秒 rollback tran select * from table1在第二個連接中執行以下語句 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED print '臟讀' select * from table1 if @@rowcount>0 begin waitfor delay '00:00:10' print '不重復讀' select * from table1 end第二個連接的結果臟讀 A B C a1 b1 c a2 b2 c a3 b3 c'不重復讀' A B C a1 b1 c1 a2 b2 c2 a3 b3 c3READ COMMITTED指定在讀取數據時控制共享鎖以避免臟讀,但數據可在事務結束前更改,從而產生不可重復讀取或幻像數據。該選項是 SQL Server 的默認值。在第一個連接中執行以下語句 SET TRANSACTION ISOLATION LEVEL READ COMMITTED begin tran print '初始' select * from table1 waitfor delay '00:00:10' --等待10秒 print '不重復讀' select * from table1 rollback tran在第二個連接中執行以下語句 SET TRANSACTION ISOLATION LEVEL READ COMMITTEDupdate table1 set c='c'第一個連接的結果初始 A B C a1 b1 c1 a2 b2 c2 a3 b3 c3不重復讀 A B C a1 b1 c a2 b2 c a3 b3 cREPEATABLE READ鎖定查詢中使用的所有數據以防止其他用戶更新數據,但是其他用戶可以將新的幻像行插入數據集,且幻像行包括在當前事務的后續讀取中。因為并發低于默認隔離級別,所以應只在必要時才使用該選項。在第一個連接中執行以下語句 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ begin tran print '初始' select * from table1 waitfor delay '00:00:10' --等待10秒 print '幻像讀' select * from table1 rollback tran在第二個連接中執行以下語句 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ insert table1 select 'a4','b4','c4'第一個連接的結果初始 A B C a1 b1 c1 a2 b2 c2 a3 b3 c3幻像讀 A B C a1 b1 c1 a2 b2 c2 a3 b3 c3 a4 b4 c4SERIALIZABLE在數據集上放置一個范圍鎖,以防止其他用戶在事務完成之前更新數據集或將行插入數據集內。這是四個隔離級別中限制最大的級別。因為并發級別較低,所以應只在必要時才使用該選項。該選項的作用與在事務內所有 SELECT 語句中的所有表上設置 HOLDLOCK 相同。在第一個連接中執行以下語句 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE begin tran print '初始' select * from table1 waitfor delay '00:00:10' --等待10秒 print '沒有變化' select * from table1 rollback tran在第二個連接中執行以下語句 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE insert table1 select 'a4','b4','c4'第一個連接的結果初始 A B C a1 b1 c1 a2 b2 c2 a3 b3 c3沒有變化 A B C a1 b1 c1 a2 b2 c2 a3 b3 c3五 事務處理嵌套的語法和對@@TRANCOUNT的影響BEGIN TRAN @@TRANCOUNT+1 COMMIT TRAN @@TRANCOUNT-1 ROLLBACK TRAN

三種使用事務的方式:

1)放在一個try~catch里面 alter PROCEDURE [dbo].[dd] AS BEGINbegin try begin traninsert into student values('new111111111111111111111111111','1',2,'23',3,getdate())insert into person values('new21312',5,'45')commit tranend trybegin catchprint 'a'rollback tranend catch end2)set xact_abord on有錯誤發生時,整個自動回滾ALTER PROCEDURE [dbo].[dd2] AS BEGINbegin tranSET XACT_ABORT oninsert into person values('n',5,'45')insert into student values('new111111111111111111111111111123','1',2,'23',3,getdate())commit tran end3)自定義變量統計@@error declare @err int set @err=0 begin tran--操作1 set @err=@err+abs(@@error)--操作2 set @err=@err+abs(@@error)--操作3 set @err=@err+abs(@@error) if @err=0 commit elserollback

轉載于:https://www.cnblogs.com/liyb5619/archive/2010/10/29/1864398.html

總結

以上是生活随笔為你收集整理的MS-SQL中的事务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。