什么是事务
    事务时包含1条或多条语句的逻辑单元。事务中的语句是一个整体,要么一起提交,要么一起撤销。事务在提交前可以回滚,一旦提交就不能撤销修改了,是永久性的修改。
 
为什么使用事务
    可以例举生活中的例子,比如银行转账:A向B转100万。程序的执行顺序:1.A账户减掉100万 2.B账户增加100万。若是都成功执行倒没什么,假设1成功执行,2执行失败,就会出问题。运用事务就不会出现这种问题,因为只要其中有一步操作失败,事务就会回滚,之前的所有操作将会被撤销。
 
事务的基本控制语句
1.BEGIN TRANSACTION:事务开始
2.COMMIT TRANSACTION:事务提交
3.ROLLBACK TRANSACTION:事务回滚
 
事务的特性(ACID)
1.ATOMIC(原子性):事务中程序是数据库的逻辑工作单元,对数据的修改要么全执行,要么全不执行。
2.CONSISTENT(一致性):事务执行前后数据一致,事务完成之后数据的修改才可见。
3.ISOLATED(隔离性):并发事务之间不能相互干扰
4.DURABLE(持久性):事务一旦提交就是对数据的永久修改。

下面是一个包含事务的存储过程的例子:
 1 ALTER proc [dbo].[Proc_InsertStudent]
2 @stuName nvarchar(50),@stuClassId int,@stuAge int
3 as
4 begin
5 set nocount on --on表示不返回计数
6 set xact_abort on --当执行事务时,如果出错,会将transcation设置为uncommittable状态
7
8 begin try
9 declare @stuCountByName int;
10 select @stuCountByName=count(*) from Students where Name=@stuName;
11
12 if(isnull(@stuName,'')='')
13 begin
14 print('名字不能为空');
15 return;
16 end
17
18 if(@stuCountByName>0)
19 begin
20 print('名字重复');
21 return
22 end
23
24 begin tran --开启事务
25 insert into Students(Name,ClassId,Age) values(@stuName,@stuClassId,@stuAge)
26 commit tran --提交事务
27
28 end try
29
30 begin catch
31 if xact_state()=-1
32 rollback tran; --回滚事务
33 select ERROR_NUMBER() as ErrorNumber;
34 select ERROR_MESSAGE() as ErrorMsg;
35 end catch
36 set xact_abort off;
37 end 其中Students表:
1 CREATE TABLE [dbo].[Students](
2 [ID] [int] IDENTITY(1,1) NOT NULL primary key,
3 [Name] [nvarchar](50) NOT NULL,
4 [ClassId] [int] NOT NULL,
5 [Age] [int] NOT NULL,
6 [CreateTime] [datetime] NOT NULL
7 );

 1 ALTER proc [dbo].[Proc_InsertStudent]
2 @stuName nvarchar(50),@stuClassId int,@stuAge int
3 as
4 begin
5 set nocount on --on表示不返回计数
6 set xact_abort on --当执行事务时,如果出错,会将transcation设置为uncommittable状态
7
8 begin try
9 declare @stuCountByName int;
10 select @stuCountByName=count(*) from Students where Name=@stuName;
11
12 if(isnull(@stuName,'')='')
13 begin
14 print('名字不能为空');
15 return;
16 end
17
18 if(@stuCountByName>0)
19 begin
20 print('名字重复');
21 return
22 end
23
24 begin tran --开启事务
25 insert into Students(Name,ClassId,Age) values(@stuName,@stuClassId,@stuAge)
26 commit tran --提交事务
27
28 end try
29
30 begin catch
31 if xact_state()=-1
32 rollback tran; --回滚事务
33 select ERROR_NUMBER() as ErrorNumber;
34 select ERROR_MESSAGE() as ErrorMsg;
35 end catch
36 set xact_abort off;
37 end

sqlserver中创建包含事务的存储过程的更多相关文章

  1. SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题

    转自  :SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题 问题: 1. System.Data.SqlClient.SqlExcepti ...

  2. 用字符流实现每个文件夹中创建包含所有文件信息的readme.txt

    package com.readme; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; i ...

  3. SqlServer中创建Oracle连接服务器

    转自太祖元年的:http://www.cnblogs.com/jirglt/archive/2012/06/10/2544025.html参考:http://down.51cto.com/data/9 ...

  4. mysql中,创建包含json数据类型的表?创建json表时候的注意事项?查询json字段中某个key的值?

    需求描述: 在mysql数据库中,创建包含json数据类型的表.记录下,在创建的过程中,需要注意的问题. 操作过程: 1.通过以下的语句,创建包含json数据类型的表 mysql> create ...

  5. SqlServer中创建Oracle链接服务器

    SqlServer中创建Oracle链接服务器 第一种:界面操作 (1)展开服务器对象-->链接服务器-->右击“新建链接服务器” (2)输入链接服务器的IP (3)链接成功后 第二种:语 ...

  6. SQLServer之创建分布式事务

    分布式事务创建注意事项 指定一个由 Transact-SQL 分布式事务处理协调器 (MS DTC) 管理的 Microsoft 分布式事务的起点. 执行 BEGIN DISTRIBUTED TRAN ...

  7. Sql语句在SqlServer中创建数据库、表格并添加约束

    通过Sql语句来创建数据库与架构 创建数据库 数据库的创建首先是要引用主数据库的,需要在master数据库的环境下进行创建.大致的语法如下: -- 使用master数据库 use master -- ...

  8. Sqlserver中查找包含某一列的所有的表

    select cols.name,cols.id,objs.name,objs.id from syscolumns cols INNER JOIN sysobjects objs on cols.i ...

  9. sqlserver中创建链接服务器

    链接服务器在跨数据库/跨服务器查询时非常有用(比如分布式数据库系统中),本文将以图文方式详细说明如何利用SQL Server Management Studio在图形界面下创建链接服务器.     1 ...

随机推荐

  1. 关于Web项目里的给表单验证控件添加结束时间不得小于开始时间的验证方法,日期转换和前台显示格式之间,还有JSON取日期数据格式转换成标准日期格式的问题

    项目里有些不同页面间的日期显示格式是不同的, 第一个问题: 比如我用日期控件WdatePicker.js导包后只需在input标签里加上onClick="WdatePicker()" ...

  2. ajax+jquery+ashx如何实现上传文件

    第一:建立Default.aspx页面 <html> <head runat="server"> <title>ajax图片上传</tit ...

  3. 【转】PowerShell入门(三):如何快速地掌握PowerShell?

    转至:http://www.cnblogs.com/ceachy/archive/2013/02/01/HowToLearnPowerShell.html 如何快速地掌握PowerShell呢?总的来 ...

  4. vs2013 类名颜色显示黑色,无法修改

    vs2013 类名黑色,修改不起作用,最后找到解决办法. http://stackoverflow.com/questions/10970305/how-can-i-get-user-type-c-s ...

  5. 161209、简要分析ZooKeeper基本原理及安装部署

    一.ZooKeeper 基本概念 1.ZooKeeper 是什么? Zookeeper官网地址: http://zookeeper.apache.org/ Zookeeper官网文档地址:http:/ ...

  6. 重置样式 - Eric Meyer的原版

    重置样式就是一组CSS声明,用来覆盖不同浏览器渲染HTML元素时的各种默认样式.重置样式一般会被加入到主样式文件的开头,用来将各个浏览器的自有默认样式重置成统一表现,确保样式表中后续追加的样式在不同浏 ...

  7. 什么是BOM头

    什么是BOM头? BOM头是放在UTF-8编码的文件的头部的,占用三个字节,用来标识该文件属于UTF-8编码.现在已经有很多软件识别BOM头,但是还有些不能识别BOM头,比如PHP就不能识别BOM头, ...

  8. centos7 nginx配置httpsCenos(6.6/7.1)下从源码安装Python+Django+uwsgi+nginx环境部署(二)

     1.yum安装nginx 下载对应当前系统版本的nginx包(package) # wget  http://nginx.org/packages/centos/7/noarch/RPMS/ngin ...

  9. Python3基础 sort 将一个列表中的值升序排列

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  10. 【原创】Capture CIS利用Access数据库建立封装库说明

    1.在服务器端建立新空间,方便封装库以及数据库的归档存放 服务器路径:\\192.168.1.234\Share\STG_LIB,文件夹内容如下,其中Datesheet存放物料数据手册,Pcb_Lib ...