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. luogu P2882 [USACO07MAR]Face The Right Way G

    题目描述 Farmer John has arranged his N (1 ≤ N ≤ 5,000) cows in a row and many of them are facing forwar ...

  2. docker-compose概述--翻译

    Overview of Docker Compose 译文 Docker Compose 是一个用来定义和执行多Docker容器程序的工具,如果使用Compose,你将可以使用一个YAML文件来配置你 ...

  3. 【读书笔记】C#高级编程 第十二章 动态语言扩展

    (一)DLR C#4的动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务. (二)dynamic类型 dynamic类型允许 ...

  4. 002从零开始入门Entity Framework Core——DbContext生存期、配置和初始化

    阅读须知:本文为入门介绍.指引文章,所示代码皆为最简易(或仅为实现功能)的演示示例版本,不一定切实符合个人(企业)实际开发需求. 一.DbContext生存期 DbContext 的生存期从创建实例时 ...

  5. 【学习笔记】Vin-Mono论文阅读笔记(一)

    VINS-Mono 概述 VINS-Mono VINS-Mono是由一个单目相机和一个低成本IMU组成的鲁棒通用的单目视觉惯性系统.通过融合预积分的IMU测量值和特征观测值来获得高精度的视觉惯性里程计 ...

  6. Elastic:使用Postman来访问需要账号密码的Elastic Stack

  7. echarts pie饼状图绑定点击事件

    var valueData = [ {value: 33,name: '诊所'}, {value: 29,name: '汽车服务相关'}, {value: 27, name: '洗衣店'}, {val ...

  8. [题解] Codeforces 1349 D Slime and Biscuits 概率,推式子,DP,解方程

    题目 神题.很多东西都不知道是怎么凑出来的,随意设置几个变量,之间就产生了密切的关系.下次碰到这种题应该还是不会做罢. 令\(E_x\)为最后结束时所有的饼干都在第x个人手中的概率*时间的和.\(an ...

  9. 矩阵顺时针打印(C++)(? 为什么不能AC,9度1391)

    #include <iostream> #include <fstream> using namespace std; int a[1000][1000]; void prin ...

  10. SQL抽象语法树及改写场景应用

    1 背景 我们平时会写各种各样或简单或复杂的sql语句,提交后就会得到我们想要的结果集.比如sql语句,"select * from t_user where user_id > 10 ...