什么是事務
事務時包含1條或多條語句的邏輯單元。事務中的語句是一個整體,要么一起提交,要么一起撤銷。事務在提交前可以回滾,一旦提交就不能撤銷修改了,是永久性的修改。
為什么使用事務
可以例舉生活中的例子,比如銀行轉賬:A向B轉100萬。程序的執行順序:1.A賬戶減掉100萬 2.B賬戶增加100萬。若是都成功執行倒沒什么,假設1成功執行,2執行失敗,就會出問題。運用事務就不會出現這種問題,因為只要其中有一步操作失敗,事務就會回滾,之前的所有操作將會被撤銷。
事務的基本控制語句
1.BEGIN TRANSACTION:事務開始
2.COMMIT TRANSACTION:事務提交
3.ROLLBACK TRANSACTION:事務回滾
事務的特性(ACID)
1.ATOMIC(原子性):事務中程序是數據庫的邏輯工作單元,對數據的修改要么全執行,要么全不執行。
2.CONSISTENT(一致性):事務執行前后數據一致,事務完成之后數據的修改才可見。
3.ISOLATED(隔離性):並發事務之間不能相互干擾
4.DURABLE(持久性):事務一旦提交就是對數據的永久修改。
下面是一個包含事務的存儲過程的例子:
1 ALTER proc [dbo].[Proc_InsertStudent]
2 @stuName nvarchar(50),@stuClassId int,@stuAge int
3 as
4 begin
5 set nocount on --on表示不返回計數
6 set xact_abort on --當執行事務時,如果出錯,會將transcation設置為uncommittable狀態
7
8 begin try
9 declare @stuCountByName int;
10 select @stuCountByName=count(*) from Students where Name=@stuName;
11
12 if(isnull(@stuName,'')='')
13 begin
14 print('名字不能為空');
15 return;
16 end
17
18 if(@stuCountByName>0)
19 begin
20 print('名字重復');
21 return
22 end
23
24 begin tran --開啟事務
25 insert into Students(Name,ClassId,Age) values(@stuName,@stuClassId,@stuAge)
26 commit tran --提交事務
27
28 end try
29
30 begin catch
31 if xact_state()=-1
32 rollback tran; --回滾事務
33 select ERROR_NUMBER() as ErrorNumber;
34 select ERROR_MESSAGE() as ErrorMsg;
35 end catch
36 set xact_abort off;
37 end
其中Students表:
1 CREATE TABLE [dbo].[Students]( 2 [ID] [int] IDENTITY(1,1) NOT NULL primary key, 3 [Name] [nvarchar](50) NOT NULL, 4 [ClassId] [int] NOT NULL, 5 [Age] [int] NOT NULL, 6 [CreateTime] [datetime] NOT NULL 7 );
1 ALTER proc [dbo].[Proc_InsertStudent]
2 @stuName nvarchar(50),@stuClassId int,@stuAge int
3 as
4 begin
5 set nocount on --on表示不返回計數
6 set xact_abort on --當執行事務時,如果出錯,會將transcation設置為uncommittable狀態
7
8 begin try
9 declare @stuCountByName int;
10 select @stuCountByName=count(*) from Students where Name=@stuName;
11
12 if(isnull(@stuName,'')='')
13 begin
14 print('名字不能為空');
15 return;
16 end
17
18 if(@stuCountByName>0)
19 begin
20 print('名字重復');
21 return
22 end
23
24 begin tran --開啟事務
25 insert into Students(Name,ClassId,Age) values(@stuName,@stuClassId,@stuAge)
26 commit tran --提交事務
27
28 end try
29
30 begin catch
31 if xact_state()=-1
32 rollback tran; --回滾事務
33 select ERROR_NUMBER() as ErrorNumber;
34 select ERROR_MESSAGE() as ErrorMsg;
35 end catch
36 set xact_abort off;
37 end

