数据库事务控制
事务(Transaction)是用来设置将连续多个的程序操作必须全部执行成功,否则必须立即答复到未执行任何程序操作的状态
事务的四大属性 事务中共有四个属性,这四个属性就称为ACID。ACID指的是:不可部分完成性(Atomicity)一致性(Consistency)隔离性(Isolation)与耐久性(Durability)等四种属性
首先建立一个演示数据库
--建库 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‘;
(1)直接在SQL语句中实现。
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
(2)利用对象SqlTransaction实现,一般通过SqlConnection 对象的BeginTransaction()方法创建,当然也可以先创建SqlTransaction事务对象,然后设置Connection属性。
public static int ExecuteSqlTran(List<String> SQLStringList) { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; SqlTransaction tx = conn.BeginTransaction(); cmd.Transaction = tx; try { int count = 0; for (int n = 0; n < SQLStringList.Count; n++) { string strsql = SQLStringList[n]; if (strsql.Trim().Length > 1) { cmd.CommandText = strsql; count += cmd.ExecuteNonQuery(); } } tx.Commit(); return count; } catch { tx.Rollback(); return 0; } } }
SqlTransaction 对象有Commit(),Rollback(),Rollback(string) ,Save(string) 几个常用的方法。
Commit():指示事务已经执行完成,同sql语句中执行commit指令。
Rollback():从挂起状态回滚事务。
Save(string),Rollback(string) :这两个方法一般配套使用,前者表示在事务的过程中创建一个保存点;后者表示回滚到指定的保存点。
(3)TransactionScope对象实现事务控制,此对象有一个Complete方法指示事务完成。没有其他的事务操作函数,一般放在using指令后,如果其中发生异常或者错误,都直接回滚。
public static int ExecuteSqlTran(List<String> SQLStringList) { using (TransactionScope scope = new TransactionScope()) { SqlConnection conn = new SqlConnection(connectionString) sqlConn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; int count = 0; for (int n = 0; n < SQLStringList.Count; n++) { string strsql = SQLStringList[n]; if (strsql.Trim().Length > 1) { cmd.CommandText = strsql; count += cmd.ExecuteNonQuery(); } } tx.Commit(); sqlConn.Close(); scope.Complete(); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。