SQL Server 事务的使用

SQL Server 事务的使用SQL Server 事务的使用

大家好,又见面了,我是你们的朋友全栈君。

前言

    在做项目的过程中,有时同一个操作会同时对数据库中的两张表进行操作,比如在机房收费系统中,下机需要把下机记录更新到下机表中,同时又要更新卡表中的余额,如果在操作数据库的过程中出现错误,只对其中的某一张表进行了操作,这样就会导致数据不一致。这时候事务就派上大用场了。

定义

    事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作系列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据的一致性。例如银行转账工作,从一个账号扣款并使一个账号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。

性质

原子性(Atomic):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。

一致性(Consistency):只有合法的数据可以被写入数据库,否则事务应该回滚到最初状态。

隔离性(Isolation):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。

持久性(Durability):事务完成之后,它对于系统的影响是永久的,真是修改了数据库。

语法

BEGIN  TRAN:开始事务,设置事务的起始点。

COMMIT  TRAN:提交事务,使事务成为数据库中永久的、不可逆转的一部分。

ROLLBACK  TRAN:回滚事务,放弃事务中对数据库所做的修改。

SAVE TRAN:设置事务的保存点。

实例

BEGIN TRAN Tran_Money    --开始事务

DECLARE @tran_error int;
SET @tran_error = 0;
    BEGIN TRY 
        UPDATE tb_Money SET MyMoney = MyMoney - 30 WHERE Name = '路人甲';
        SET @tran_error = @tran_error + @@ERROR;
        --测试出错代码,看看路人甲的钱减少,路人乙的钱是否会增加
        --SET @tran_error = 1;
        UPDATE tb_Money SET MyMoney = MyMoney + 30 WHERE Name = '路人乙';
        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


事务可以设置在程序的代码中,也可以写在数据库的脚本中,下面是一个事务和存储过程结合使用的例子

ALTER PROCEDURE [dbo].[Proc_UpdateGoods]
	@name varchar(30),
	@supportName varchar(30),
	@count varchar(30),
	@price varchar(30),
	@totalPrice varchar(30),
	@note varchar(30),
	@timespan datetime,
	@unit varchar(30)
AS

BEGIN 
	begin tran
	declare @num int
	insert  into T_inputinfo (supportName,name,count,price,totalPrice,note,timespan) values(@supportName,@name,@count,@price,@totalPrice,@note,@timespan)
	SELECT @num= COUNT(name)  FROM T_suppliesinfo where name=@name 
	if(@num=0) insert into T_suppliesinfo (name,count,unit) values(@name,@count,@unit)
	else update T_suppliesinfo set count=count+@count

	if @@error<>0 
	begin
	rollback tran
	return 0
	end
	else
	begin 
	commit tran	
	return 1
	end
End


总结

    学过的理论知识是在概念上的理解,重要的还是需要去实践。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105745.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++中的explicitkeyword

    C++中的explicitkeyword

    2021年11月24日
    46
  • vue前后台数据交互vue-resource文档

    vue前后台数据交互vue-resource文档

    2021年10月11日
    42
  • 2019最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)

    2019最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)近期总结一一些面试题都是企业的面试题笔记题感觉薪资10k下的都会出笔试题特别高的薪资都是直接技术面试或者是现场编程总结很多人的面试题,后期会对于单个知识点再说笔记详细讲解。部分都是百度的答案,不是特全面的,可以自己找下同时分享一个自己录制的CSS3动画特效经典案例【推荐教程】–后期会更新vue框架微信小程序等内容。https://ke.qq.com/cou…

    2022年5月31日
    35
  • 腾讯创始人团队_美国it名人

    腾讯创始人团队_美国it名人http://blog.csdn.net/cyblueboy83/article/details/44037487新年一到,支付宝微信红包大战硝烟再起,阿里腾讯为抢地狂烧钱,QQ、微信朋友圈红包满天飞,着实让大家玩得不亦乐乎。社交领域一直是互联网创业的大热门,从PC到移动端,从OICQ、MSN到QQ。到了移动互联网时代,社交领域应用开始彻底爆发,直奔黄金期。腾讯在过去几年里,社

    2022年8月30日
    1
  • 【Win10系统】Win10系统无线网消失,更改适配器只有以太网,找不到WLAN怎么解决?

    【Win10系统】Win10系统无线网消失,更改适配器只有以太网,找不到WLAN怎么解决?已经快三天了,不想重装系统,前天早上起床打开电脑突然发现右下角网络只有一个飞行模式,旁边的WLAN消失了,到网络属性中更改适配器设置也没找到,几乎试了网上所有的解决办法。1.网络重置2.cmd命令netshwinsockreset3.关机-断电-拔电池或者插拔网卡(未尝试,还要拆螺丝,麻烦)4.services.msc启动那几个服务项5.开飞行模式,重启,关飞行模式6.CClea…

    2022年7月11日
    75
  • 漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

    漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)0x00前言本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理、设计、以及在我们大数据场景下的实现方式。全文由下面几个部分组成:先分享一下拉链表的用途、什么是拉链表。通过一些小的使用场景来对拉链表做近一步的阐释,以及拉链表和常用的切片表的区别。举一个具体的应用场景,来设计并实现一份拉链表,最后并通过一些例子说明如何使用我们设计的这张表(因为现在Hive的大规模使用

    2022年10月17日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号