SQL事务

 
 
 
SQL 事务
 
一、事务概念
    事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等。
 
二、事务属性
事务 4 大属性:
1   原子性 (Atomicity): 事务是一个完整的操作。
2   一致性( Consistency ):当事务完成时,数据必须处于一致状态。
3   隔离性 (Isolation): 对数据进行修改的所有并发事务是彼此隔离的。
4   持久性 (Durability): 事务完成后,它对于系统的影响是永久性的。
 
三、创建事务
T-SQL 中管理事务的语句:
1 开始事务 : begin transaction
2 提交事务: commit transaction
3 回滚事务 : rollback transaction
 
事务分类 :
1 显式事务 : begin transaction 明确指定事务的开始。
2 隐性事务:打开隐性事务: set implicit_transactions on ,当以隐性事务模式操作时, SQL Servler 将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。
3 自动提交事务: SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务。如果成功执行,则自动提交,否则回滚。
 
示例:张三转 800 元到李四帐户上。
 
use  stuDB
go
-- 创建帐户表bank--
if   exists ( select *   from  sysobjects  where  name = ' bank ' )
    
drop   table  bank
create   table  bank
(
    customerName 
char ( 10 ),     -- 顾客姓名
    currentMoney  money          -- 当前余额
)
go
/*--添加约束,帐户不能少于元--*/
alter   table  bank  add
        
constraint  CK_currentMoney  check (currentMoney >= 1 )
/*--插入测试数据--*/
insert   into  bank(customerName,currentMoney)
select   ' 张三 ' , 1000   union
select   ' 李四 ' , 1

select   *   from  bank
go

/*--使用事务--*/
use  stuDB
go
-- 恢复原来的数据
--
update bank set currentMoney=currentMoney-1000 where customerName='李'
set  nocount  on      -- 不显示受影响的行数
print   ' 查看转帐事务前的余额 '
select   *   from  bank
go

/*--开始事务--*/
begin   transaction
declare   @errorSum   int      -- 定义变量,用于累计事务执行过程中的错误
/*--转帐--*/
update  bank  set  currentMoney = currentMoney - 800   where  customerName = ' 张三 '
set   @errorSum = @errorSum + @@error      -- 累计是否有错误
update  bank  set  currentMoney = currentMoney + 800   where  customerName = ' 李四 '
set   @errorSum = @errorSum + @@error   -- 累计是否有错误

print   ' 查看转帐事务过程中的余额 '
select   *   from  bank

/*--根据是否有错误,确定事务是提交还是回滚--*/
if   @errorSum > 0
    
begin
        
print   ' 交易失败,回滚事务. '
        
rollback   transaction
    
end
else
    
begin
        
print   ' 交易成功,提交事务,写入硬盘,永久保存! '
        
commit   transaction
    
end
go

print   ' 查看转帐后的余额 '
select   *   from  bank
go


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值