本节主要介绍Sql语句,SqlTransaction和TransactionScope这三种使用事务的方法。

本节的所有例子都在sql server 2008和vs 2008环境下运行通过,如果没有sql server2008,那么使用sql server 2005也一样,但是sql se rver 2000上是无法运行通过的,因为某些sql语句在2000中不支持。请大家注意这点。

请先执行下面的脚本,在本机的数据库实例中建立测试数据库,以方便运行例子。

[c-sharp] view plaincopy
  1. --建库
  2. IF EXISTS (SELECT name FROM sys.databases WHERE name = N'TransTestDb')
  3. drop database [TransTestDb]
  4. CREATE DATABASE [TransTestDb];
  5. --建表
  6. use [TransTestDb]
  7. Go
  8. IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TransTestTable]') AND type in (N'U'))
  9. drop table [TransTestTable]
  10. CREATE TABLE [dbo].[TransTestTable](Id int, [Name] varchar(16));
  11. --初始值
  12. use [TransTestDb]
  13. go
  14. insert into [TransTestTable]
  15. select 1,'a' union
  16. select 2,'b' union
  17. select 3,'c';

首先介绍利用Sql语句来使用事务。Sql Server2005/2008提供了begin tran,commit tran和rollback tran三个语句来显示的使用事务。begin tran表示事务开始,commit tran表示事务提交,rollback tran表示事务回滚。具体代码如下:

[c-sharp] view plaincopy
  1. begin try
  2. begin tran
  3. insert into dbo.TransTestTable values (66,'66');
  4. update dbo.TransTestTable set [Name] = '77' where [Id] = 66;
  5. --RAISERROR ('Error raised in TRY block.',16,1);
  6. commit tran
  7. end try
  8. begin catch
  9. rollback tran
  10. end catch

代码中的begin try和begin catch是捕获异常时使用的,只在sql server2005/2008中支持,sql server 2000上不支持这个语句。在begin try 和 end try之间的代码运行时如果发生异常,则程序会跳转到begin catch和end catch中执行相关的rollback tran回滚操作。在begin tran和commit tran之间就是一个事务,insert和update必须同时成功,否则就同时失败。RAISERROR 语句的意思是抛出一个异常,只在sql server2005/2008中支持,sql server 2000上不支持这个语句。

执行上面的代码,我们会发现,插入和更新同时都成功了。把RAISERROR的注释去掉后,再执行,我们会发现,插入和更新都回滚了。因为RAISERROR抛出异常后,没有执行到commit tran,而是直接执行begin catch里面的rollback tran回滚语句了。

下面介绍SqlTransaction的使用方法。SqlTransaction是System.Data.SqlClient命名空间下的一个事务类,主要方法有Commit()和Rollback()两个函数,更多方法和属性请参考MSDN。具体代码如下:

[c-sharp] view plaincopy
  1. static void Main(string[] args)
  2. {
  3. SqlConnection sqlConn = new SqlConnection(
  4. ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
  5. SqlTransaction sqlTrans = null;
  6. try
  7. {
  8. sqlConn.Open();
  9. sqlTrans = sqlConn.BeginTransaction();//事务开始
  10. SqlCommand sqlComm = new SqlCommand("", sqlConn, sqlTrans);
  11. sqlComm.CommandTimeout = 120;
  12. sqlComm.CommandType = System.Data.CommandType.Text;
  13. string insertSql = "insert into dbo.TransTestTable values (66,'66');";
  14. string updateSql = "update dbo.TransTestTable set [Name] = '77' where [Id] = 66;";
  15. sqlComm.CommandText = insertSql;
  16. sqlComm.ExecuteNonQuery();//执行insert
  17. sqlComm.CommandText = updateSql;
  18. sqlComm.ExecuteNonQuery();//执行update
  19. //throw new Exception("test exception.the transaction must rollback");
  20. sqlTrans.Commit();//事务提交
  21. }
  22. catch (Exception ex)
  23. {
  24. sqlTrans.Rollback();//事务回滚
  25. Console.WriteLine(ex.Message);
  26. }
  27. finally
  28. {
  29. if (sqlConn.State != System.Data.ConnectionState.Closed)
  30. sqlConn.Close();
  31. }
  32. Console.ReadLine();
  33. }

上面的代码显示了SqlTransaction类的基本使用方法。首先使用SqlConnection建立连接后,sqlConn.BeginTransaction()表示事务的开始,在执行一些基本操作后(代码是执行一个insert和一个update)后,执行sqlTrans.Commit();表示事务提交,这时候,刚才insert和update的数据在数据库才能被使用。如果把throw new Exception("test exception.the transaction must rollback");这句的注释去掉,我们会发现,程序没有执行提交,而是直接执行了catch中的Rollback(),进行了回滚。那么刚才的insert和update一起被回滚。

最后看一下TransactionScope的基本用法。TransactionScope继承IDisposable接口,所以一般在using中使用。具体代码如下:

[c-sharp] view plaincopy
  1. static void Main(string[] args)
  2. {
  3. using (TransactionScope scope = new TransactionScope())
  4. {
  5. SqlConnection sqlConn = new SqlConnection(
  6. ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
  7. sqlConn.Open();
  8. string insertSql = "insert into [TransTestTable] values(11,'11')";
  9. string updateSql = "update [TransTestTable] set [Name] = '111' where [Id] = 11";
  10. SqlCommand sqlComm = new SqlCommand(insertSql, sqlConn);
  11. sqlComm.CommandType = System.Data.CommandType.Text;
  12. sqlComm.ExecuteNonQuery();
  13. sqlComm = new SqlCommand(updateSql, sqlConn);
  14. sqlComm.CommandType = System.Data.CommandType.Text;
  15. sqlComm.ExecuteNonQuery();
  16. sqlConn.Close();
  17. scope.Complete();
  18. }
  19. Console.ReadLine();
  20. }

在using中定义了一个TransactionScope,相当于定义了一个事务范围即这个事务作用域为using内。程序执行了两个动作,一个insert,一个update,最后执行了scope.Complete();相当于提交事务。如果把scope.Complete();注释掉,我们会发现insert和update都被回滚了,因为在using作用域内,如果没有提交命令,那么scope在销毁时,会自动回滚所有的操作

以上就是三种事务的基本使用方法,在此基础之上,还可以引申出更多的问题,比如嵌套事务,三种方法的混合使用等问题。在此就不一一列举了。

Sql Server数据库事务介绍(二)---Sql语句,SqlTransaction和TransactionScope的使用方法相关推荐

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

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

  2. Microsoft SQL Server 数据库使用(二)

    ##Microsoft SQL Server 数据库使用(二) 数据库练习使用可以在我的资源下载中下载数据库脚本文件. 一.查询数据 注:下面使用 Microsoft SQL Server 2019 ...

  3. 将本地SQL Server数据库迁移到Azure SQL数据库

    In this article, we will discuss and understand a method to migrate an on-premises SQL Server databa ...

  4. 数据库-SQL Server数据库查询速度慢(连接超时)原因及优化方法

    SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列 ...

  5. SQL Server数据库开发的二十一条军规

    如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导(其中大多数也可以用于其它的DBMS). 在 ...

  6. SQL Server数据库第十二课:事务处理

    知识点:事务概念.事务处理 1.事务简介 1.1  什么是事务 事务(Transaction)是一个由多条SQL语句组成的工作逻辑单元,这些语句要么全部执行成功,要么全部不执行,只要有一条SQL语句执 ...

  7. excel 链接sql server数据库,并使用sql语句导出自己想要的数据

    问题: 部分数据需要从sql server 2008 数据库中导出到excel中,Excel程序自带的外部数据连接功能,可以连接SQL服务器.当然还有其他的办法如: excel-vba 也可以实现,但 ...

  8. sql server数据库事务日志已满请参阅log_reuse_wait_desc怎么解决?

    数据库使用时,莫名其妙出现关于事务日志已满的报错.具体报错如下: 数据库中的事务日志已满.若要查明无法重用日志中的空间的原因,请参阅sys.databases中的log_reuse_wait_desc ...

  9. 合肥工业大学—SQL Server数据库实验三:SQL语句创建和删除基本表

    SQL语句创建和删除基本表 1. 编写6个基本表 2. 修改基本表结构,完整性约束条件 3. 用Drop table 语句删除基本表 1. 编写6个基本表 设有简单教学管理的6个关系模式如下: 系(系 ...

最新文章

  1. 两个什么漏洞,可让十亿安卓手机被获取Root权限?
  2. 经典面试题:计算积水的横截面积
  3. PicoBlaze 设计实例
  4. mac电脑sublime text3安装pretty json插件
  5. 无极*压缩 之7-Zip!
  6. ictclas4j 分词工具包 安装流程
  7. 对超长的文字换行处理:程序和CSS样式
  8. ansible常用命令
  9. python画roc曲线_使用Python画ROC曲线以及AUC值
  10. 合理使用EntityFramework数据验证的异常错误提示信息
  11. Win10- 日历 - 周日在第一列显示 - 设置方法
  12. jsoup解析百度音乐
  13. uniapp-蓝牙模块封装
  14. [DELPHI] 使用mod函数换行
  15. 面试题——内网相关(一)
  16. 网络安全:漏洞测试主要平台 BackTrack4+Metasploit+ruby
  17. 华为顶级黑客整理的399本编程电子书,整整16个G,你想学的都有
  18. android模拟器电视,Android TV开发之模拟器的设置
  19. UVa 11223 - O: dah dah dah!
  20. MSI B450迫击炮装机常见问题解决方法

热门文章

  1. 如何禁止wifi万能钥匙连接我的路由器?
  2. Facebook为人才收购荷兰软件美工计划公司
  3. 面试问题:如何模拟SQL Server死锁 (附视频和脚本)
  4. 攻防大牛在身边,这群白帽极客的故事太精彩!
  5. 获取更全面的软文写作攻略
  6. 横线从文字中间穿过的CSS效果属性和html标签
  7. 关于家里两个路由器进行级联时配置
  8. Vue中v-if 和v-show的区别
  9. 国美控股集团与车势公司达成合作,探索汽车新零售
  10. maya动画制作(3)——龙的各种姿态动画制作(续)(修改更新)