时间:2021-07-01 10:21:17 帮助过:5人阅读
例如,银行转账工作:从一个账号扣款并使另一个账 号增款,这两个操作要么都执行,要么都不执行。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
针对上面的描述可以看出,事务的提出主要是为了解决并发情况下保持数据一致性的问题。
事务具有以下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
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上只是自己对于事务书写规范的认识,可能不够全面严谨,希望各位指教!
数据库事务书写简单DEMO(新手见解)
标签: