c#中事物使用
数据库事务(简称: 事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。
事务的特性(ACID性质)
原子性(Atomic)
事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency)
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
隔离性(Isolation)
多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability)
已被提交的事务对数据库的修改应该永久保存在数据库中。
下面介绍事务的具体使用。
事务在数据库中的使用
- BEGIN TRANSACTION
- --向Table1表中插入记录
- INSERT INTO Table1 VALUES('1','1')
- SET @Err1=@@ERROR
- --向Table2表插入记录
- INSERT INTO Table2 VALUES('1','1')
- SET @Err2=@@ERROR
- IF(@Err1=0 AND @Err2=0)
- COMMIT TRANSACTION --事务提交
- ELSE
- ROLLBACK TRANSACTION --事务回滚
@@ERROR:完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另一条 Transact-SQL 语句被执行。
事务在.NET代码中的使用
首先添加引用usingSystem.Transactions;

(1)只在D层使用事务
- //设定事务的级别
- TransactionOptions option = new TransactionOptions();
- option.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
- using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, option))
- {
- //标志是否更改成功
- bool flag = false;
- bool flagUpdate = false;
- //更新Table1中数据
- string sqlUpText = "UPDATE Table1 SET actionReason = '1'";
- flagUpdate = sqlHelper.ExecuteNonQuery(sqlUpText,CommandType.Text);
- //更新Table2中数据
- string sqlText = "UPDATE Table2 SET isAvailable ='否' ";
- flag = sqlHelper.ExecuteNonQuery(sqlText, CommandType.Text);
- if (flag && flagUpdate)
- {
- ts.Complete();
- return true;
- }
- else {
- return false;
- }
- }
(2)事务在B层的使用
B层代码
- //首先引用 System.Data和System.Data.SqlClient命名空间
- //定义事务执行所使用的链接
- SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["strConnDB"].ToString());
- //打开连接
- sqlCon.Open();
- //定义事务
- SqlTransaction sqlTran = sqlCon.BeginTransaction(IsolationLevel.ReadCommitted);
- //用try...Catch...finally保证事务在出错时会回滚
- try
- {
- //向课程表中添加数据
- OptionalCourseScheduleLinkDAL OptionalCourseSchedule = new OptionalCourseScheduleLinkDAL();
- //将新建立的连接和事务一起传回D层
- IsAddOptionalCourseSchedule = OptionalCourseSchedule.AddOptionalCourseSchedule(enOptionalCourseSchedule,sqlCon,sqlTran);
- //更新授课关系表中的单双周
- CourseTeachClassLinkDAL CourseTeachClass = new CourseTeachClassLinkDAL();
- //添加D层的方法,调用sqlHelper中执行事务的方法:ExecNoSelect(string cmdText, SqlParameter[] paras, CommandType cmdType, SqlConnection sqlConns, SqlTransaction sqlTran)
- //将新建立的连接和事务一起传回D层
- IsUpdateCourseTeachClass = CourseTeachClass.UpdateCourseTeachClassOddEven(enCourseTeachClass,sqlCon,sqlTran);
- //若添加和更新有一者返回false,事务回滚
- if (IsAddOptionalCourseSchedule && IsUpdateCourseTeachClass)
- {
- //如果都为真,提交
- sqlTran.Commit();
- sqlCon.Close();
- return true;
- }
- else {
- sqlTran.Rollback();
- }
- }
- catch (Exception)
- {
- //出现异常时,事物回滚
- sqlTran.Rollback();
- }
- finally {
- sqlCon.Close();
- }
- return false;
D层代码
- public Boolean AddOptionalCourseSchedule(OptionalCourseScheduleLinkEntity enOptionalCourseScheduleLink, SqlConnection sqlCon, SqlTransaction sqlTran)
- {
- //声明一个布尔型变量
- Boolean blnIsResult = false;
- //执行SQL字符串名
- string strSQL = "insert into TBR_OptionalCourseScheduleLink(TeachClassID,RoomID,WorkDay,ClassBegin,ClassEnd) VALUES(@TeachClassID,@RoomID,@WorkDay,@ClassBegin,@ClassEnd)";
- //字符串数组
- SqlParameter[] param = new SqlParameter[]
- {
- new SqlParameter("@TeachClassID",enOptionalCourseScheduleLink.TeachClassID),//虚拟班ID
- new SqlParameter("@RoomID",enOptionalCourseScheduleLink.RoomID),//房间ID
- new SqlParameter("@WorkDay",enOptionalCourseScheduleLink.WorkDay),//星期
- new SqlParameter("@ClassBegin",enOptionalCourseScheduleLink.ClassBegin),//开始时间(如:上午第一节)
- new SqlParameter("@ClassEnd",enOptionalCourseScheduleLink.ClassEnd)//结束时间
- };
- //SQL语句类型
- CommandType cmdType = CommandType.Text;
- //SQLHELPER函数返回值
- blnIsResult = sqlHelper.ExecNoSelect(strSQL, param, cmdType, sqlCon, sqlTran);
- //返回函数值
- return blnIsResult;
- }
SqlHelper中关于事务的代码
- #region 执行sql语句(事务中使用)
- /// <summary>执行sql语句(事务中使用)
- /// 执行sql语句(事务中使用)
- /// </summary>
- /// <param name="cmdText">在事务中执行的某个SQL语句或存储过程</param>
- /// <param name="paras">参数集合</param>
- /// <param name="cmdType">命令类型</param>
- /// <param name="sqlConn">数据库连接</param>
- /// <param name="sqlTran">事务</param>
- public Boolean ExecNoSelect(string cmdText, SqlParameter[] paras, CommandType cmdType, SqlConnection sqlConns, SqlTransaction sqlTran)
- {
- try
- {
- //实例化数据库命令SqlCommand
- sqlCmd = new SqlCommand(cmdText, sqlConns);
- //命令类型:存储过程or SQL语句
- sqlCmd.CommandType = cmdType;
- //添加参数
- sqlCmd.Parameters.AddRange(paras);
- //事务
- sqlCmd.Transaction = sqlTran;
- //定义事务执行结果
- int intResult = sqlCmd.ExecuteNonQuery();
- //执行事务:大于0返回true,否则返回false。
- if (intResult > 0)
- {
- //事务执行成功
- return true;
- }
- else
- {
- //事务执行失败
- return false;
- }
- }
- catch (Exception ex)
- {
- //抛出异常
- throw ex;
- }
- }
- #endregion
c#中事物使用的更多相关文章
- [原创]java WEB学习笔记109:Spring学习---spring中事物管理
博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好 ...
- JAVA中事物以及连接池
一.事物 什么是事物? 事务,一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元.这些单元要么全都成功,要么全都不成功. 做一件事情,这个一件事情中有多个 ...
- SSM-Spring-21:Spring中事物的使用案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 股票买卖案例(我会用三种开启事物的方法 代理工厂bean版的,注解版的,aspectj xml版的) 简单的介 ...
- 转:Spring中事物管理
1.什么是事务? 事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败 2.事物具有四大特性ACID 说到事务,就不得不说其4大特性,主要如下 原子性:(atomicity) 原子性指的是事务是 ...
- MySQL中事物的详解
1. 事物的定义及特性 事务是一组操作数据库的SQL语句组成的工作单元,该工作单元中所有操作要么同时成功,要么同时失败.事物有如下四个特性,ACID简称“酸性”. 1)原子性:工作单元中所有的操作要么 ...
- Oracle在Java中事物管理
对于 对数据库中的数据做dml操作时,能够回滚,这一事物是很重要的 下面例子是对数据库中数据进行修改 package com.demo.oracle; import java.sql.Connecti ...
- Oracle中事物处理--事物隔离级别
n 事物隔离级别 概念:隔离级别定义了事物与事物之间的隔离程度. ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别(这是国际标准化组织定义的一个标准而已,不同的数据库在实现时有所不同) ...
- sqlserver中 事物 索引及视图
事务 1.什么是事务 事务是一个不可分割的工作逻辑单元,它包含了一组数据库的操作命令,并且所有命令作为一个整体一起向系统提交或撤销操作请求,即要么都执行,要么都不执行 2.事务的4个属性 (1). ...
- spring boot 中事物的使用
一.什么是事务? 事务,通俗的说就是,同时做多个事,要么全做,要么不做,也是其特性.举个例子来说,好比你在某宝.某东.某多上购物,在你提交订单的时候,库存也会相应减少,不可能是钱付了,库存不减少,或者 ...
随机推荐
- JSHint Options 翻译
Enforcing options When set to true, these options will make JSHint produce more warnings about your ...
- Python中的条件判断和循环
1.使用elif代替else if,前者是后者的缩写. 2.所以for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句. 3.Python提供一个range()函数,可以生成一 ...
- python之 sqlalchemy
one To many #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @author: zengchunyun & ...
- sqlserver跨服务器数据库sql语句
1.启用Ad Hoc Distributed Queries:exec sp_configure 'show advanced options',1reconfigureexec sp_configu ...
- java 打印流(PrintStream)
打印流(PrintStream):打印流可以打印任意类型的数据,而且打印流在打印数据之前会将数据转为字符串在进行打印 PrintStream可以接受文件和其他字节输出流,所以打印流是对普通字节输出流的 ...
- plist文件里的"Bundle versions string, short" 跟 "Bundle version" 的区别及作用
Bundle versions string, short:用于itunes上显示的版本号,即对外的版本,一般除了版本迭代外,不能随意更改. Bundle version:内部项目管理的版本号,是给程 ...
- Daily Scrum02 12.08
编译大作业的第一次检查终于过去了,已经经过这次检查的组员们可以暂时松一口气了. 也希望编译大作业有着落的成员可以多花一些时间在团队任务上,帮其他的组员多分担一些工作. 第一次没来的及检查的同学,或是没 ...
- CSS3初学篇章_7(布局/浏览器默认样式重置)
CSS布局说到布局,就不得不提布局的核心<div>标签,它与其它标签一样,也是一个XHTML所支持的标签,专门用于布局设计的容器标签.在css布局方式中,div 是这种布局方式的核心对象, ...
- 在Unity中使用TDD - 初探
描述 Editor Tests Runner是Unity中用来实现TDD的,其内部实现是基于NUnit. 其他 测试脚本要放在Editor文件夹中,测试要能够在一帧的时间内完成. 使用 打开Edito ...
- 3.Powershell编辑器
工欲善其事,必先利其器.有个得心应手的工具会使你的学习事半功倍.使用什么工具来编辑Powershell指令比较方便呢?笔者前后使用过几个编辑器,有几个比较不错推荐给大家试用. Powershell I ...