sql事务

原文出处:     http://blog.csdn.net/tjvictor/article/details/4074240#

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

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

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

[c-sharp] view plain copy

  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 plain copy

  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 plain copy

  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 plain copy

  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在销毁时,会自动回滚所有的操作

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

时间: 2024-12-27 15:57:16

sql事务的相关文章

SQL事务日志备份时的问题

1.在进行事务日志备份的时候,如下图: 3041 消息的疑难解答时的考虑事项:不会只是一个数据库或所有数据库出现问题吗?是备份到本地存储区或远程存储吗?哪种类型的备份 (数据库备份. 日志备份和差异备份) 是否出现故障?正在执行备份的应用程序 (SQL Server 代理作业. SQL 维护计划或 VDI/VSS 备份软件供应商提供的备份代理程序) 是什么?用于备份命令的选项是什么?什么是在其下运行 SQL Server 的帐户,此帐户没有所需的访问目标位置写入文件? 参考:http://sup

sql事务(Transaction)用法介绍及回滚实例

事务是将一系列操作作为一个单元执行,要么成功,要么失败,回滚到最初状态.在事务处理术语中,事务要么提交,要么中止.若要提交事务,所有参与者都必须保证对数据的任何更改是永久的.不论系统崩溃或是发生其他无法预料的事件,更改都必须是持久的.只要有一个参与者无法做出此保证,整个事务就会失败.事务范围内的所有数据更改将回滚到特定设置点. Begin TRANSACTION 语句1; If @@error<>0 Goto error 语句2; If @@error<>0 Goto error

sql事务和存储过程

一.sql事务 1.什么是事务:事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时事务是做为最小的控制单元来使用的.他包含的所有数据库操作命令作为一个整体一起向系提交或撤消,这一组数据库操作命令要么都执行,要么都不执行. 2.事务的语句开始事物:BEGIN TRANSACTION提交事物:COMMIT TRANSACTION回滚事务:ROLLBACK TRANSACTION 3.事务的4个特性  ①原子性(Atomicity):事务中的所有元素作为一个整体提交或回滚,是不可折分的,事

sql事务(Transaction)用法介绍及回滚实例_转

sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性 当对多个表进行更新的时候,某条执行失败.为了保持数据的完整性,需要使用事务回滚. 显示设置事务 代码如下 begin try   www.2cto.com begin transaction insert into shi

sql事务的调用

一.数据库的SQL USE [Text]GO/****** Object: StoredProcedure [dbo].[mon] Script Date: 2017-01-03 15:59:28 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER proc [dbo].[mon] @toID int, --接收转账的账户 @fromID int , --转出自己的账户 @momeys money, --转账的金额 @back in

SQL—— 事务

SQL 事务: 1.  定义: 事务是作为单个逻辑单元执行的一系列操作. 多个操作作为一个整体向系统提交,要么执行.要么都不执行,事务是一个不可分割的工作逻辑单元.这特别适用于多用户同时操作的数据通信系统.例如:订票.银行.保险公司以及证券交易系统等. 2. 事务必须具备的特性: 1) 原子性:  Atomicity  :事务是一个完整的操作, 个元素是不可再分的.事务中所以元素必须作为一个整体提交或回滚.如果十五中任何元素失败,则整个事务将失败. 2)一致性: Consistency: 当事务

sql 事务日志传输

原文:sql 事务日志传输 概述 可以使用日志传送将事务日志不间断地从一个数据库(主数据库)发送到另一个数据库(辅助数据库).不间断地备份主数据库中的事务日志,然后将它们复制并还原到辅助数据库,这将使辅助数据库与主数据库基本保持同步.目标服务器充当备份服务器,并可以将查询处理从主服务器重新分配到一个或多个只读的辅助服务器.日志传送可与使用完整或大容量日志恢复模式的数据库一起使用:使用日志传送,您可以自动将“主服务器”实例上“主数据库”内的事务日志备份发送到单独“辅助服务器”实例上的一个或多个“辅

sql事务,在sql2000里判断执行是否成功用@@ERROR 判断

原文:sql事务,在sql2000里判断执行是否成功用@@ERROR 判断 贴个sql事务,在sql2000里判断执行是否成功用@@ERROR 判断 这个东西多少还是有点问题,sql2005了可以用try..catch了,不管那块错都能捕捉,然后在回滚,很方便,贴出来晾晾 BEGIN TRANSACTION; BEGIN TRY  --try 执行sql       SELECT 1/0; END TRY BEGIN CATCH  --cache抓错     SELECT         ERR

SQL 事务 (存储过程与事务)

<1> C# 执行SQL事务 又两种方法(本人总结的) 1.通过存储过程. 现在就演示一下通过存储过程来执行SQL事务. 2.通过C#中提供的 Transaction . SQL Server 事务语法 Sql server 事务的两种用法 <1>创建一个存储过程, use sales --指定数据库 create table bb --创建bb 这个表 ( ID int not null primary key ,--账号 Moneys money --转账金额 ) --bb表里

030.[转] sql事务特性

sql事务特性简介 pphh发布于2018年10月5日 Sql事务有原子性.一致性.隔离性.持久性四个基本特性,要实现完全的ACID事务,是以牺牲事务的吞吐性能作为代价的.在有些应用场景中,通过分析业务数据读写,使得可以降低事务的隔离性,容忍相应出现的数据一致性问题,实现事务的高并发.高吞吐.低时延性,这是sql事务优化的最佳实践.本文对sql标准中隔离性级别定义和可能会出现的问题进行一一介绍,最后通过Mysql数据库进行相应的演示. 目录 1. Sql事务特性 2. Sql事务特性:原子性 3