事务(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存储过程,这样就相对比较简单,总之是两种方法各有各的优点。

转载于:https://www.cnblogs.com/litaohao/archive/2013/03/02/2939766.html

Sql server 事务的两种用法相关推荐

  1. [转]快速清除SQL Server日志的两种方法

    日志文件满而造成SQL数据库无法写入文件时,可用两种方法: 第一种方法:清空日志. 1.打开查询分析器,输入命令 以下是引用片段: DUMP TRANSACTION 数据库名 WITH NO_LOG ...

  2. 微软SQL Server数据库的两种请求游标

    游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字.用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理. 关系数据库中的操 ...

  3. 连接sql server数据库的两种方式

    class DB     { private static SqlConnection conn; public static SqlConnection getConn() { //conn = n ...

  4. SQL Server事务隔离级别详解

    SQL Server事务隔离级别详解 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用 ...

  5. 20180928 SQL SERVER 事务回滚

    begin tran:设置起点 commit tran:使事务成为数据库中永久的.不可逆转的一部分 rollback tran:本质上说想要忘记它曾经发生过 save tran:创建一个特定标记,只允 ...

  6. Sql Server事务日志

    本文导读:SQL Server中的数据库都是由一或多个数据文件以及一或多个事务日志文件组成的.SQL Server事务日志主要是用来记录所有事务对数据库所做的修改,SQL SERVER利用事务日志来确 ...

  7. 了解SQL Server事务日志备份和完整备份的日志序列号

    This article explores the SQL Server Transaction log backups and log sequence number (LSN) in combin ...

  8. 使用SQL Server事务复制将SQL Server数据库迁移到Azure SQL数据库

    In this guide, we'll discuss more about migrating a SQL Server database to Azure SQL Database using ...

  9. 读取SQL Server事务日志

    介绍 (Introduction) There has always been some debate as to whether or not there are real benefits to ...

最新文章

  1. Redis集群研究和实践(基于redis 3.0.5)
  2. 启动和退出mysql的三种方法_Oracle数据库几种启动和关闭方式
  3. 3.15曝光“山寨”杀毒软件“杀毒三宗罪”
  4. Win7系统关闭兼容性选项的方法
  5. abb限位开关已打开drv1_Telemecanique传感器限位开关产品系列
  6. 备忘:SharePoint默认的欢迎WebPart中超链接样式
  7. ubuntu查看oracle客户端,ubuntu 9.04 下安装 oracle 客户端oracle-xe-client
  8. iphone换机数据迁移_怎么一键换机?换新机迁移数据必看教程!
  9. Mosquitto --topic
  10. db2和oracle数据同步,DB2与Oracle数据库之间的远程复制(转)
  11. BIM二开获取CAD信息必备Teigha库,TD_Mgd_3.09.dll下载和使用操作步骤
  12. 亲测:优酷下载的会员独享KUX视频快速转换成MP4格式!
  13. 风云再续:他抖任他抖,IO诊断在我手
  14. 日语入门选什么书好?
  15. linux读取ads1115ADC例程
  16. 干细胞科学家李陶博士入股机器人365
  17. 程序员容易发福的原因及解决办法
  18. IT职业技能图谱:IT工程师学习路线
  19. 用R求矩阵的特征值和特征向量
  20. AI竞争即人才之争 领英发布《全球AI领域人才报告》

热门文章

  1. java学习笔记-良葛格_Java良葛格 学习笔记《二》
  2. python 数组 indexof_Javascript Array.lastIndexOf()方法
  3. 【php7扩展开发二】全局变量
  4. 入门级实操教程!从概念到部署,全方位了解K8S Ingress!
  5. 【Lucene4.8教程之六】QueryParser与Query子类:如何生成Query对象
  6. Scala入门到精通——第九节 继承与组合
  7. Iterator 和 for...of 循环
  8. 并发编程之 Semaphore 源码分析
  9. 数据结构-直接寻址表
  10. 毕业后才认清的15个道理