事务( Transaction )是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。

通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
在sql server+ .net 开发环境下,有两种方法能够完成事务的操作,保持数据库的数据完整性;
一个就是用sql存储过程,另一个就是在ADO.NET中一种简单的事务处理;
现在通过一个典型的银行转账的例子来说明一下这两个例子的用法
我们先来看看sql存储过程是如何来完成事务的操作的:
首先创建一个表:
create database aaaa --创建一个表,包含用户的帐号和钱数
go
use aaaa
create table bb
(
 ID int not null primary key,  --帐号
 moneys money    --转账金额
insert into bb values ('1','2000') --插入两条数据
insert into bb values ('2','3000')

用这个表创建一个存储过程:

create procedure mon --创建存储过程,定义几个变量

@toID int,    --接收转账的账户

@fromID int ,  --转出自己的账户

@momeys money --转账的金额

as

begin tran --开始执行事务

update bb set moneys=moneys-@momeys where ID=@fromID -执行的第一个操作,转账出钱,减去转出的金额

update bb set moneys=moneys+@momeys where ID=@toID --执行第二个操作,接受转账的金额,增加

if @@error<>0 --判断如果两条语句有任何一条出现错误

begin rollback tran –开始执行事务的回滚,恢复的转账开始之前状态

return 0

end

go

else   --如何两条都执行成功

begin commit tran 执行这个事务的操作

return 1

end

go

接下来看看C#.net 是如何调用这个存储过程的:

protected void Button1_Click(object sender, EventArgs e)

{

SqlConnection con =new SqlConnection(@"Data Source=.\SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx"); //连接字符串

SqlCommand cmd = new SqlCommand("mon",con); //调用存储过程

cmd.CommandType = CommandType.StoredProcedure;

con.Open();

SqlParameter prar = new SqlParameter();//传递参数

cmd.Parameters.AddWithValue("@fromID", 1);

cmd.Parameters.AddWithValue("@toID", 2);

cmd.Parameters.AddWithValue("@momeys",Convert.ToInt32( TextBox1.Text) );

cmd.Parameters.Add("@return", "").Direction = ParameterDirection.ReturnValue;//获取存储过程的返回值

cmd.ExecuteNonQuery();

string value = cmd.Parameters["@return"].Value.ToString();//把返回值赋值给value

if (value == "1")

{

Label1.Text = "添加成功";

}

else

{

Label1.Text = "添加失败";

}

}

这个也就是在存储过程里添加事务,再来看看不在数据库写sql存储过程,ADO.NET是如何处理事务的:

protected void Button2_Click(object sender, EventArgs e)

{

SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx");

con.Open();

SqlTransaction tran = con.BeginTransaction();//先实例SqlTransaction类,使用这个事务使用的是con这个连接,使用BeginTransaction这个方法来开始执行这个事务

SqlCommand cmd = new SqlCommand();

cmd.Connection = con;

cmd.Transaction = tran;

try

{

//在try{}块里执行sqlcommand命令,

cmd.CommandText = "update bb set moneys=moneys-'" + Convert.ToInt32(TextBox1.Text) + "' where ID='1'";

cmd.ExecuteNonQuery();

cmd.CommandText = "update bb set moneys=moneys+' aa ' where ID='2'";

cmd.ExecuteNonQuery();

tran.Commit();//如果两个sql命令都执行成功,则执行commit这个方法,执行这些操作

Label1.Text = "添加成功";

}

catch

{

Label1.Text = "添加失败";

tran.Rollback();//如何执行不成功,发生异常,则执行rollback方法,回滚到事务操作开始之前;

}

}

这就是两个事务不同用法的简单例子,ADO.NET事务处理的方法看起来比较简单,但是他要使用同一个连接来执行这些操作,要是同时使用几个数据库来用一个事务执行,这样就比较繁琐,但是要是用sql存储过程,这样就相对比较简单,总之是两种方法各有各的优点

Sql server 事务 存储过程的更多相关文章

  1. SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过

    SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过     存储过程 创建存储过程 use pubs --pubs为数据库 go create proc ...

  2. 人人都是 DBA(VI)SQL Server 事务日志

    SQL Server 的数据库引擎通过事务服务(Transaction Services)提供事务的 ACID 属性支持.ACID 属性包括: 原子性(Atomicity) 一致性(Consisten ...

  3. SQL Server 优化存储过程的七种方法

    原文:SQL Server 优化存储过程的七种方法 优化存储过程有很多种方法,下面介绍最常用的7种. 1.使用SET NOCOUNT ON选项 我们使用SELECT语句时,除了返回对应的结果集外,还会 ...

  4. sql server系统存储过程大全

    关键词:sql server系统存储过程,mssql系统存储过程 xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 x ...

  5. SQL Server在存储过程中编写事务处理代码的三种方法

    SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所 ...

  6. SQL Server 事务复制分发到订阅同步慢

    原文:SQL Server 事务复制分发到订阅同步慢 最近发现有一个发布经常出现问题,每几天就出错不同步,提示要求初始化.重新调整同步后,复制还是很慢!每天白天未分发的命令就达五六百万条!要解决慢的问 ...

  7. 在sql server中建存储过程,如果需要参数是一个可变集合怎么处理?

    在sql server中建存储过程,如果需要参数是一个可变集合的处理 原存储过程,@objectIds 为可变参数,比如 110,98,99 ALTER PROC [dbo].[Proc_totalS ...

  8. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  9. SQL Server事务的隔离级别

    SQL Server事务的隔离级别 ########## 数据库中数据的一致性 ########## 针对并发事务出现的数据不一致性,提出了4个级别的解决方法:  隔离级别  第一类丢失更新  脏读 ...

随机推荐

  1. Maven手动创建多模块项目

    Maven手动创建多模块项目 我要创建的项目名称是:unicorn,项目包含两个模块,分别是unicorn-core和unicorn-web.包的路径是com.goldpalm.tour. 项目创建流 ...

  2. 常用Java片段

    1. 字符串与整型的相互转换 String a = String.valueOf(2);   //integer to numeric string int i = Integer.parseInt( ...

  3. Java之工厂模式

    interface Fruit {     void eat(); } class Apple implements Fruit {     public void eat() {         S ...

  4. ubuntu中查找软件的安装位置

    ubuntu中的软件可通过图形界面的软件中心安装,也可以通过命令行apt-get install安装.但是安装后的软件在哪个位置呢?这点跟windows环境下安装软件的路径选择不一样.ubuntu中可 ...

  5. Java中的枚举类型详解

    枚举类型介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义 ...

  6. POJ 1743 Musical Theme(后缀数组+二分答案)

    [题目链接] http://poj.org/problem?id=1743 [题目大意] 给出一首曲子的曲谱,上面的音符用不大于88的数字表示, 现在请你确定它主旋律的长度,主旋律指的是出现超过一次, ...

  7. 使用vi编辑binary文件

    原理:使用xxd将当前文件转成hex格式,编辑,然后再转回去 /usr/bin/xxd xxd - make a hexdump or do the reverse 例子: 用binary模式启动vi ...

  8. c#打印记忆功能

    下面这些实例都可以拷下直接用 总体思路:保存打印设置信息到本地文件,下次打印的时候直接读取文件信息,通过序列化与反序列化来获取值.本例只是针对打印的横纵向进行设置,读者也可以增加其他设置信息进行保存读 ...

  9. 网页在Safari快速滚动和回弹的原理: -webkit-overflow-scrolling : touch;的实现

    现在很多for Mobile的H5网页内都有快速滚动和回弹的效果,看上去和原生app的效率都有得一拼. 要实现这个效果很简单,只需要加一行css代码即可: -webkit-overflow-scrol ...

  10. ceph之纠删码

    转自:http://m.blog.csdn.net/blog/skdkjxy/45695355 一.概述 按照误码控制的不同功能,可分为检错码.纠错码和纠删码等. 检错码仅具备识别错码功能 而无纠正错 ...