1. 为什么要使用事务?

当一个存储过程或多个SQL语句(指代insert、update、delete类型)依次执行时候,

如果其中一条或几条发生错误,但是其他的还会继续执行,会造成数据的不一致,非常危险。常见的,比如银行,我们从一个账号

转钱到另一个账号,如果当我们转出的时候,系统发生了故障,但是没有转入,这样的话,银行的数据就出问题。想解决这个问题,我们使用事务!

2. 事务的特点

原子性:就是不可分割性,是一个整体。

一致性:也就是我们操作的数据,前后都保持高度的一致。

3. 主要作用:就是保证数据在不同的操作中,或者这些操作全部成功,或者失败的时候全部取消。

4. 事务的创建和使用(示例代码)

在SQLServer中全局变量使用@@标识

常见的:@@Identity @@error 用来存储SQL操作最后一条语句的状态。

建议:如果你在开发中,使用存储过程,只要是两个或两个以上的insert、update或delete类型的SQL被执行,你就都可以

使用事务。后续扩展:我们在C#应用程序中,如果我们发送的SQL语句,有多个insert或update、delete,同样在C#中也可以直接使用事务

--首先测试@@error全局变量的使用
if exists(select * from sysobjects where name='usp_AddProduct3')
drop procedure usp_AddProduct3
go
create procedure usp_AddProduct3
@ProductId varchar(50),
@ProductName varchar(50),
@UnitPrice numeric(18,2),
@Unit varchar(50),
@CategoryId int,
@MinCount int,
@MaxCount int
as
declare @errorSum int --@errorSum这个变量用来记录错误号码的总数 --在商品信息表中,添加数据
insert into Products(ProductId, ProductName, UnitPrice, Unit, CategoryId)
values(@ProductId, @ProductName, @UnitPrice, @Unit, @CategoryId)
select @@error --同时在商品库存表中,添加数据
insert into ProductInventory(ProductId, MinCount, MaxCount, TotalCount,StatusId)
values(@ProductId, @MinCount, @MaxCount,0, -2)
select 错误号码=@@error
go
--观察错误号码
exec usp_AddProduct3 '6005004003599','测试商品1',1,'箱',10,100,200
-----------------------------------------------------事务-----------------------------------------------------------
--建立两个一对一错的存储过程测试事务的作用
if exists(select * from sysobjects where name='Course__Procedure4')
drop procedure Course__Procedure4
go
create procedure Course_Procedure4
--定义参数
@CourseName nvarchar(50),
@CourseContent nvarchar(500),
@ClassHour int,
@Credit int,
@CategoryId int,
@TeacherId int
as
--编写具体的存储过程内容
insert into Course(CourseName,CourseContent,ClassHour,Credit,CategoryId,TeacherId)
values(@CourseName,@CourseContent,@ClassHour,@Credit,@CategoryId,@TeacherId);
go
exec Course_Procedure4 'Emgucv图像处理教程','C#版本的图像处理1',300,10,12,2000 --会继续执行
exec Course_Procedure4 'Emgucv图像处理教程','C#版本的图像处理2',300,10,30,2000 --会出错
select * from Course where CourseName='Emgucv图像处理教程'; --综上所述,事务的作用,使得存储过程执行多个增删改查任务时同时成功或者同时失败
--编写事务
if exists(select * from sysobjects where name='Course__Procedure5')
drop procedure Course__Procedure5
go
create procedure Course__Procedure5
--定义参数
@CourseName nvarchar(50),
@CourseContent nvarchar(500),
@ClassHour int,
@Credit int,
@CategoryId int,
@TeacherId int,
@CategoryName varchar(50)
as
declare @errorNum int;---定义变量
set @errorNum=0;--设置初始值
--开启事务
begin transaction
begin
--编写具体的存储过程内容
insert into Course(CourseName,CourseContent,ClassHour,Credit,TeacherId,CategoryId) --可能出错
values(@CourseName,@CourseContent,@ClassHour,@Credit,@TeacherId,@CategoryId);
set @errorNum+=@@error
print @errorNum; insert into CourseCategory(CategoryName) --不会出错
values(@CategoryName);
set @errorNum+=@@error
print @errorNum;
if(@errorNum>0) --有错误
rollback transaction --回滚事务
else --无错误
commit transaction --提交事务
end
go
--调用事务
exec Course__Procedure5 'Emgucv图像处理','C#板opencv',300,10,200,2000,'.NET系列课程' --出错
exec Course__Procedure5 'Emgucv图像处理','C#板opencv',300,10,12,2000,'.NET系列课程' --执行成功
select * from CourseCategory

事务的作用就是要么全部成功,要么回到执行事务前的状态。

SQLSever事务的更多相关文章

  1. Winform开发框架里面使用事务操作的原理及介绍

    在很多情况下,事务是个很有用的东西,可以把一系列的操作组合成一个原子粒度的操作,一旦组合中某个地方出错,可以整个干净的进行滚回,不会留下脏数据:除此之外,事务还能提高批量操作的效率,如在本地SQLit ...

  2. ASP.NET + SqlSever 大数据解决方案 PK HADOOP

    半个月前看到博客园有人说.NET不行那篇文章,我只想说你们有时间去抱怨不如多写些实在的东西.  1.SQLSERVER优点和缺点? 优点:支持索引.事务.安全性以及容错性高 缺点:数据量达到100万以 ...

  3. SqlSever锁及存储过程优化

    SqlSever锁及存储过程优化 SQL server的所有活动都会产生锁.锁定的单元越小,就越能提高并发处理能力,但是管理锁的开销越大.如何找到平衡点,使并发性和性能都可接受是SQL Server的 ...

  4. SQLSever视图和存储过程

    一.视图(View) 1. 为什么要学习视图? 在没有视图之前,我们都是写各种各样的SQL语句,有点,非常灵活.后面我们学习应用程序开发的时候,通过C#发送过来的SQL语句 到达数据库的时候,会执行什 ...

  5. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  6. SQLServer事务同步下如何收缩日志

    事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...

  7. 事务日志已满,原因为“ACTIVE_TRANSACTION”

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 异常处理汇总-数据库系列  http://www.cnblogs.com/dunitia ...

  8. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  9. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

随机推荐

  1. 第七十一篇:Vue组件的私有和全局注册

    好家伙, 1.组件的父子关系 我们封装三个组件,分别为left组件,right组件和App组件 在封装时: 在封装时,彼此的关系是独立的,并不存在父子关系 在使用时: 在使用时,根据彼此的嵌套关系,形 ...

  2. class 中的 构造方法、static代码块、私有/公有/静态/实例属性、继承 ( extends、constructor、super()、static、super.prop、#prop、get、set )

     part 1         /**          * << class 中的 static 代码块与 super.prop 的使用          *          * - ...

  3. PHP8中match新语句的操作方法

    PHP8 新出的一个语法很好用,就是 match 语句.match 语句跟原来的 switch 类似,不过比 switch 更加的严格和方便 原来的 switch 语句代码如下: 1 function ...

  4. Trigger Before 与 After 区别

    用户在使用trigger时,经常会面临before or after的选择问题.二者有什么区别?从字面理解,before trigger 是在触发操作完成之前完成,而after 是在触发操作完成之后完 ...

  5. 【ASP.NET Core】自定义Session的存储方式

    在开始今天的表演之前,老周先跟大伙伴们说一句:"中秋节快乐". 今天咱们来聊一下如何自己动手,实现会话(Session)的存储方式.默认是存放在分布式内存中.由于HTTP消息是无状 ...

  6. 【设计模式】Java设计模式 - 外观模式

    Java设计模式 - 外观模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  7. Beats:使用Elastic Stack对Redis监控

  8. Elasticsearch集群规模和容量规划的底层逻辑

    转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484628&idx=1&sn=666e416ae ...

  9. PAT (Basic Level) Practice 1012 数字分类 分数 20

    给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1​ = 能被 5 整除的数字中所有偶数的和: A2​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1​−n ...

  10. 关于WinSCP如何通过Tunnel隧道进行远程连接-进行文件的传输

    对于公司业务相关的重要的Linux服务器,一般都会限制源IP登录,一般就会使用到jumper server(跳板机) 这样一来,我们的Client就无法直接ssh/scp/sftp到目标服务器了,这样 ...