Sql Server数据库事务介绍(二)---Sql语句,SqlTransaction和TransactionScope的使用方法
本节主要介绍Sql语句,SqlTransaction和TransactionScope这三种使用事务的方法。
本节的所有例子都在sql server 2008和vs 2008环境下运行通过,如果没有sql server2008,那么使用sql server 2005也一样,但是sql se rver 2000上是无法运行通过的,因为某些sql语句在2000中不支持。请大家注意这点。
请先执行下面的脚本,在本机的数据库实例中建立测试数据库,以方便运行例子。
- --建库
- IF EXISTS (SELECT name FROM sys.databases WHERE name = N'TransTestDb')
- drop database [TransTestDb]
- CREATE DATABASE [TransTestDb];
- --建表
- use [TransTestDb]
- Go
- IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TransTestTable]') AND type in (N'U'))
- drop table [TransTestTable]
- CREATE TABLE [dbo].[TransTestTable](Id int, [Name] varchar(16));
- --初始值
- use [TransTestDb]
- go
- insert into [TransTestTable]
- select 1,'a' union
- select 2,'b' union
- select 3,'c';
首先介绍利用Sql语句来使用事务。Sql Server2005/2008提供了begin tran,commit tran和rollback tran三个语句来显示的使用事务。begin tran表示事务开始,commit tran表示事务提交,rollback tran表示事务回滚。具体代码如下:
- begin try
- begin tran
- insert into dbo.TransTestTable values (66,'66');
- update dbo.TransTestTable set [Name] = '77' where [Id] = 66;
- --RAISERROR ('Error raised in TRY block.',16,1);
- commit tran
- end try
- begin catch
- rollback tran
- 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。具体代码如下:
- static void Main(string[] args)
- {
- SqlConnection sqlConn = new SqlConnection(
- ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
- SqlTransaction sqlTrans = null;
- try
- {
- sqlConn.Open();
- sqlTrans = sqlConn.BeginTransaction();//事务开始
- SqlCommand sqlComm = new SqlCommand("", sqlConn, sqlTrans);
- sqlComm.CommandTimeout = 120;
- sqlComm.CommandType = System.Data.CommandType.Text;
- string insertSql = "insert into dbo.TransTestTable values (66,'66');";
- string updateSql = "update dbo.TransTestTable set [Name] = '77' where [Id] = 66;";
- sqlComm.CommandText = insertSql;
- sqlComm.ExecuteNonQuery();//执行insert
- sqlComm.CommandText = updateSql;
- sqlComm.ExecuteNonQuery();//执行update
- //throw new Exception("test exception.the transaction must rollback");
- sqlTrans.Commit();//事务提交
- }
- catch (Exception ex)
- {
- sqlTrans.Rollback();//事务回滚
- Console.WriteLine(ex.Message);
- }
- finally
- {
- if (sqlConn.State != System.Data.ConnectionState.Closed)
- sqlConn.Close();
- }
- Console.ReadLine();
- }
上面的代码显示了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中使用。具体代码如下:
- static void Main(string[] args)
- {
- using (TransactionScope scope = new TransactionScope())
- {
- SqlConnection sqlConn = new SqlConnection(
- ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
- sqlConn.Open();
- string insertSql = "insert into [TransTestTable] values(11,'11')";
- string updateSql = "update [TransTestTable] set [Name] = '111' where [Id] = 11";
- SqlCommand sqlComm = new SqlCommand(insertSql, sqlConn);
- sqlComm.CommandType = System.Data.CommandType.Text;
- sqlComm.ExecuteNonQuery();
- sqlComm = new SqlCommand(updateSql, sqlConn);
- sqlComm.CommandType = System.Data.CommandType.Text;
- sqlComm.ExecuteNonQuery();
- sqlConn.Close();
- scope.Complete();
- }
- Console.ReadLine();
- }
在using中定义了一个TransactionScope,相当于定义了一个事务范围即这个事务作用域为using内。程序执行了两个动作,一个insert,一个update,最后执行了scope.Complete();相当于提交事务。如果把scope.Complete();注释掉,我们会发现insert和update都被回滚了,因为在using作用域内,如果没有提交命令,那么scope在销毁时,会自动回滚所有的操作
以上就是三种事务的基本使用方法,在此基础之上,还可以引申出更多的问题,比如嵌套事务,三种方法的混合使用等问题。在此就不一一列举了。
Sql Server数据库事务介绍(二)---Sql语句,SqlTransaction和TransactionScope的使用方法相关推荐
- 使用SQL Server事务复制将SQL Server数据库迁移到Azure SQL数据库
In this guide, we'll discuss more about migrating a SQL Server database to Azure SQL Database using ...
- Microsoft SQL Server 数据库使用(二)
##Microsoft SQL Server 数据库使用(二) 数据库练习使用可以在我的资源下载中下载数据库脚本文件. 一.查询数据 注:下面使用 Microsoft SQL Server 2019 ...
- 将本地SQL Server数据库迁移到Azure SQL数据库
In this article, we will discuss and understand a method to migrate an on-premises SQL Server databa ...
- 数据库-SQL Server数据库查询速度慢(连接超时)原因及优化方法
SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列 ...
- SQL Server数据库开发的二十一条军规
如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导(其中大多数也可以用于其它的DBMS). 在 ...
- SQL Server数据库第十二课:事务处理
知识点:事务概念.事务处理 1.事务简介 1.1 什么是事务 事务(Transaction)是一个由多条SQL语句组成的工作逻辑单元,这些语句要么全部执行成功,要么全部不执行,只要有一条SQL语句执 ...
- excel 链接sql server数据库,并使用sql语句导出自己想要的数据
问题: 部分数据需要从sql server 2008 数据库中导出到excel中,Excel程序自带的外部数据连接功能,可以连接SQL服务器.当然还有其他的办法如: excel-vba 也可以实现,但 ...
- sql server数据库事务日志已满请参阅log_reuse_wait_desc怎么解决?
数据库使用时,莫名其妙出现关于事务日志已满的报错.具体报错如下: 数据库中的事务日志已满.若要查明无法重用日志中的空间的原因,请参阅sys.databases中的log_reuse_wait_desc ...
- 合肥工业大学—SQL Server数据库实验三:SQL语句创建和删除基本表
SQL语句创建和删除基本表 1. 编写6个基本表 2. 修改基本表结构,完整性约束条件 3. 用Drop table 语句删除基本表 1. 编写6个基本表 设有简单教学管理的6个关系模式如下: 系(系 ...
最新文章
- 两个什么漏洞,可让十亿安卓手机被获取Root权限?
- 经典面试题:计算积水的横截面积
- PicoBlaze 设计实例
- mac电脑sublime text3安装pretty json插件
- 无极*压缩 之7-Zip!
- ictclas4j 分词工具包 安装流程
- 对超长的文字换行处理:程序和CSS样式
- ansible常用命令
- python画roc曲线_使用Python画ROC曲线以及AUC值
- 合理使用EntityFramework数据验证的异常错误提示信息
- Win10- 日历 - 周日在第一列显示 - 设置方法
- jsoup解析百度音乐
- uniapp-蓝牙模块封装
- [DELPHI] 使用mod函数换行
- 面试题——内网相关(一)
- 网络安全:漏洞测试主要平台 BackTrack4+Metasploit+ruby
- 华为顶级黑客整理的399本编程电子书,整整16个G,你想学的都有
- android模拟器电视,Android TV开发之模拟器的设置
- UVa 11223 - O: dah dah dah!
- MSI B450迫击炮装机常见问题解决方法