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


总结

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • github 网络安全_黑客编程语言

    github 网络安全_黑客编程语言这个开源项目是黑客的多合一工具包,包含了各种黑客工具,比如逆向工程、老鼠工具、SQL注入工具等等。声明:该开源项目仅限学习使用,勿用与从事违法活动。开源地址:https://github.com/Z4nzu/hackingtool这个开源项目是教程序员如何优雅地挣零花钱,本开源项目是一本电子书,从副业的重要性、到程序员可能得副业路径,以及知识付费、课程录制等实战案例为基础,打磨的一本程序员副业指南。开源地址:https://github.com/easychen/lean-side-bussiness“Aw

  • ubuntu彻底卸载docker_docker安装win10

    ubuntu彻底卸载docker_docker安装win10删除docker程序记事本新建脚本文件a.ps1,内容如下:$ErrorActionPreference=”SilentlyContinue”kill-force-processname’DockerforWindows’,com.docker.db,vpnkit,com.docker.proxy,com.docker.9pdb,moby-diag-dl,dockerd…

  • 用启动易合并启动光盘图解教程

    用启动易合并启动光盘图解教程用启动易合并启动光盘图解教程发布时间:2007-04-26来源:矽谷漂移工作组嘿嘿绿盟不提供注册码,我来提供,用户:xdowns.com注册码:2566-11AC-0624-22BCultraiso,激活成功教程版下载地址:[url]http://www.xdowns.com/soft/4/124/2006/So…

  • length命令怎么用Matlab,matlab中length函数用法「建议收藏」

    length命令怎么用Matlab,matlab中length函数用法「建议收藏」matlab中的length表示什么?应该如何使用?length:数组长度(即行数或列数中的较大值);使用方法:n=length(A):如果A为非空数组,返回行数和列数两者之间数值较大的那一个值,即相当于执行了max(size(A));如果A为空数组,则返回0;如果A是一个向量则返回A的长度。length(x)在matlab中是什么意思?iflength(h)>1||h<0…

  • bootstrap模态框关闭后清除模态框的数据

    bootstrap模态框关闭后清除模态框的数据

  • Linux下干净卸载mysql详解

    Linux下干净卸载mysql详解1、使用以下命令查看当前安装mysql情况rpm-qa|grep-imysql可以看到如下图的所示:显示之前安装了:MySQL-client-5.5.25a-1.rhel5MySQL-server-5.5.25a-1.rhel52、停止mysql服务、删除之前安装的mysql删除命令:rpm-e–nodeps包名rpm-evMySQL

发表回复

您的电子邮箱地址不会被公开。

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