sqlserver中创建包含事务的存储过程

什么是事务

事务时包含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 );

时间: 2024-08-08 11:34:54

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

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

转自  :SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题 问题: 1. System.Data.SqlClient.SqlException (0x80131904): EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配.上一计数 = 1,当前计数 = 0. 2. EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配.上一计数 = 0,当前计数 = 1. 后面的内容,是我之前

SqlServer中创建Oracle连接服务器

转自太祖元年的:http://www.cnblogs.com/jirglt/archive/2012/06/10/2544025.html参考:http://down.51cto.com/data/910072SqlServer中创建Oracle连接服务器 第一种:界面操作 (1)展开服务器对象-->链接服务器-->右击“新建链接服务器”(2)输入链接服务器的IP (3)链接成功后 第二种:语句操作 注:需要提前安装Oracle客户端程序,重启机器.(如果没有Oracle客户端程序,提示“未找

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

1 package com.readme; 2 3 import java.io.BufferedWriter; 4 import java.io.File; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 import java.text.SimpleDateFormat; 8 import java.util.Date; 9 import java.util.Scanner; 10 11 /** 12 * @autho

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

通过Sql语句来创建数据库与架构 创建数据库 数据库的创建首先是要引用主数据库的,需要在master数据库的环境下进行创建.大致的语法如下: 1 -- 使用master数据库 2 use master 3 -- 创建数据库 4 create datebase [架构名.]数据库名 5 on [primary]--主文件数据描述 6 ( 7 name = '数据库逻辑名', --一般是数据库的名称 8 filename = '数据文件的名字',--全路径 9 size = 12mb, --数据文件

sqlserver中创建链接服务器

链接服务器在跨数据库/跨服务器查询时非常有用(比如分布式数据库系统中),本文将以图文方式详细说明如何利用SQL Server Management Studio在图形界面下创建链接服务器. 1.展开服务器对象-->链接服务器-->右击"新建链接服务器"注意:必须以数据库管理员身份登录(通常也就是sa帐号)后,才可以创建"链接服务器" 2.输入链接服务器的IP 3.设置链接服务器的安全性 完成后,如下图:现在测试一下,用帐号user本地登录SqlServe

在sqlserver中创建表

1:在sql语句中,临时表有两类,分别是局部(local)和全局(global)临时表,局部临时表只在其会话(事务)中可见,全局临时表可以被会话(事务)中的任何程序或者 模块访问 2:创建局部临时表 [sql] view plaincopyprint? use db_sqlserver go create table #db_local_table ( id  int, name varchar(50), age int, area int ) use db_sqlserver go creat

dojo中创建包含节点复选框的树形(CheckBoxTree)

树形结构是界面设计程中常见的部件,在代码实现时有很多方法,但由于设计到节点的父子关系和dom节点操作,实现起来比较复杂.dojo中提供了带复选框的树形部件CheckBoxTree,使用时只需创建对应的实例即可轻松实现此功能. 部件对应的html文件代码如下: <div> <div dojoType="dijit.Dialog" dojoAttachPoint="testList" title="${title}" style=&

SqlServer中创建非聚集索引和非聚集索引

聚集索引与非聚集索引,其实已经有很多的文章做过详细介绍. 非聚集索引 简单来说,聚集索引是适合字段变动不大(尽可能不出现Update的字段).出现字段重复率小的列,因为聚集索引是对数据物理位置相同的索引,所以一张表中只能出现一个聚集索引. 聚集索引的特征:代表全部数据存储的位置索引,不能经常去更新这个字段,最好不出现重复. 聚集索引 非聚集索引也有很多人叫法上细分为唯一索引.全文索引.普通索引,我们在进项条件查询时,作为条件过滤的字段通常被设置为非聚集索引,这样就不需要去读取原始记录,直接查询索

在android中创建包含对象数组的Parcelable

public class Bill implements Parcelable{ // 订单号 public int orderid; // 原系统id public int oldid; // 订单地址 public String address; // 订单备注 public String ext; // 订单电话 public String mobile; // 订单用户姓名 public String name; // 已支付金额 public double payed; // 订单时间