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)
上一篇 2022年4月24日 下午11:00
下一篇 2022年4月24日 下午11:00


相关推荐

  • AutoContext:智能体递归自进化的开源系统

    AutoContext:智能体递归自进化的开源系统

    2026年3月16日
    2
  • Linux文件重命名的几种方法 rename

    Linux文件重命名的几种方法 renamehttps blog csdn net weixin article details https blog csdn net csdnnews article details https blog csdn net weixin article details https blog

    2026年3月17日
    2
  • 谷歌浏览器油猴插件安装教程(超详细),让你的浏览器更加强大[通俗易懂]

    谷歌浏览器油猴插件安装教程(超详细),让你的浏览器更加强大[通俗易懂]什么是扩展程序首先,你要知道油猴是什么的话,那你就必须知道谷歌浏览器的扩展程序是什么?点解浏览器右上角–>更多工具–>扩展程序,进入我们的扩展程序界面,在这里可以看到我们已经安装的扩展程序。那么扩展程序可以做什么呢?举个例子,像我安装的Infinity新标签页,就可以实现以下功能,将浏览器原本的新标签页样式变成这个样子那么油猴是干什么的呢其实,油猴就是属于我们上面说的扩…

    2022年7月14日
    198
  • xp系统计算机快捷键,xp系统dos命令窗口快捷键是什么

    xp系统计算机快捷键,xp系统dos命令窗口快捷键是什么XP 系统快速进入 DOS 系统方法汇总 平常操作电脑我们很少用到 DOS 系统 所以对其也会比较少去了解 下面就让学习啦小编和大家说说 XP 系统 dos 命令窗口的快捷键是什么 xp 系统 dos 命令窗口快捷键如果是 WindowsXP 只能进入一个虚拟的命令行窗口 方法是 开始 gt 运行 gt 在打开的对话框里输入 command 或 cmd 再单击 确定 即可 或者 开始 gt 所有程序 gt 附

    2026年3月26日
    3
  • webdriver下载

    webdriver下载chrome浏览器驱动下载地址:http://chromedriver.storage.proxy.ustclug.org/index.htmlchrome版本在80后的chrome版本和chromedriver版本对应firefox浏览器驱动下载地址:https://github.com/mozilla/geckodriver/releasesie浏览器驱动下载地址:http://selenium-release.storage.proxy.ustclug.org/index.htmlIEDriv

    2026年1月28日
    7
  • 怎么查看win服务器端口占用,Windows怎么查看端口占用?查看本机端口占用情况…「建议收藏」

    怎么查看win服务器端口占用,Windows怎么查看端口占用?查看本机端口占用情况…「建议收藏」什么是端口?假设计算机是一座楼房,端口号就是房号,而端口便是楼层入口。如果需要应用程序和服务器连接的话,必须打开该房门才能连接网络访问服务器。正如站在门口的保安,一些启动应用时刻都在占用端口,我们需要怎么了解某个端口被哪个应用程序占用呢,阅读下文了解查看端口占用情况的方法。操作步骤:1、开始→运行→cmd进入命令提示符→输入netstat-ano即可看到所有连接的PID;2、在任…

    2022年7月27日
    10

发表回复

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

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