因為最近在做項目時多次應用到了事務,在這里簡單舉一個數據庫事務的DEMO ,希望大家批評指正,謝謝!
那么,廢話不多說,我們開始先從事務的介紹以及一系列知識點說起:
事務(Transaction)是並發控制的基本單位。所謂的事務,它是一個操作序列,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位。
例如,銀行轉賬工作:從一個賬號扣款並使另一個賬 號增款,這兩個操作要么都執行,要么都不執行。所以,應該把它們看成一個事務。事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性。
針對上面的描述可以看出,事務的提出主要是為了解決並發情況下保持數據一致性的問題。
事務具有以下4個基本特征。
● Atomic(原子性):事務中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要么全部成功,要么全部失敗。
● Consistency(一致性):只有合法的數據可以被寫入數據庫,否則事務應該將其回滾到最初狀態。
● Isolation(隔離性):事務允許多個用戶對同一個數據進行並發訪問,而不破壞數據的正確性和完整性。同時,並行事務的修改必須與其他並行事務的修改相互獨立。
● Durability(持久性):事務結束后,事務處理的結果必須能夠得到固化。
2.事務的語句
開始事物:begin transaction
提交事物:commit transaction
回滾事務:rollback transaction
3.事務的4個屬性
①原子性(Atomicity):事務中的所有元素作為一個整體提交或回滾,事務的個元素是不可分的,事務是一個完整操作。
②一致性(Consistemcy):事物完成時,數據必須是一致的,也就是說,和事物開始之前,數據存儲中的數據處於一致狀態。保證數據的無損。
③隔離性(Isolation):對數據進行修改的多個事務是彼此隔離的。這表明事務必須是獨立的,不應該以任何方式以來於或影響其他事務。
④持久性(Durability):事務完成之后,它對於系統的影響是永久的,該修改即使出現系統故障也將一直保留,真實的修改了數據庫
4.事務的保存點
save transaction 保存點名稱 --自定義保存點的名稱和位置
rollback transaction 保存點名稱 --回滾到自定義的保存點
如果這樣還不了解,直接上個有關於充值的DEMO:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
USE [MoneyProduct]
GO
/****** Object: StoredProcedure [dbo].[Pro_InsertMoneyRecordes] Script Date: 07/01/2016 09:32:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[Pro_InsertMoneyRecordes] --一個存儲過程,這個沒什么說的
@U_Id int,@MR_money decimal,@MR_time datetime,@MR_state int,@MR_depict varchar(100),@MR_typeId int,@MR_numbers varchar(100) ,@Bid int,@Cy_Id int ,@Cy_numbers varchar (100)
as
begin
begin tran Tran_Money --開始事務
DECLARE @tran_error int ;
set @tran_error =0;
begin try
insert into MoneyRecord values(@U_Id,@MR_money,@MR_time,@MR_state ,cast (@MR_depict as varchar),@MR_typeId,@MR_numbers,@Bid,@Cy_Id,cast (@Cy_numbers as varchar));
--添加充值信息
set @tran_error =@tran_error+@@ERROR;
--測試出錯代碼,看看充值數據是否添加成功
--SET @tran_error = 1;
select @@IDENTITY as 'identity';--查詢新添數據最后一行的標識列
set @tran_error = @tran_error+@@ERROR;
insert into CZRecord values(@@IDENTITY);--向充值記錄里添加一條信息
set @tran_error = @tran_error+@@ERROR;
update Capital set C_balance=C_balance+@MR_money where C_Id = (select C_Id from UserInfo where U_Id =@U_Id)--修改賬戶中心余額
set @tran_error = @tran_error+@@ERROR;
end try
begin catch
print '出現異常'+convert(varchar,error_number())+',錯誤信息'+error_message()
set @tran_error=@tran_error+1;
end catch
if(@tran_error>0)
begin
--執行出錯,回滾事務
ROLLBACK TRAN;
Print '充值失敗'
end
else
begin
--沒有異常,提交事務
COMMIT TRAN;
Print '充值成功'
end
end
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上只是自己對於事務書寫規范的認識,可能不夠全面嚴謹,希望各位指教!