数据库事务(简称: 事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

事务的特性(ACID性质)

原子性(Atomic)

事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

一致性(Consistency)

事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

隔离性(Isolation)

多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

持久性(Durability)

已被提交的事务对数据库的修改应该永久保存在数据库中。

下面介绍事务的具体使用。

事务在数据库中的使用

  1. BEGIN TRANSACTION
  2. --向Table1表中插入记录
  3. INSERT INTO Table1 VALUES('1','1')
  4. SET @Err1=@@ERROR
  5. --向Table2表插入记录
  6. INSERT INTO Table2 VALUES('1','1')
  7. SET @Err2=@@ERROR
  8. IF(@Err1=0 AND @Err2=0)
  9. COMMIT TRANSACTION  --事务提交
  10. ELSE
  11. ROLLBACK TRANSACTION    --事务回滚

@@ERROR:完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另一条 Transact-SQL 语句被执行。

事务在.NET代码中的使用

首先添加引用usingSystem.Transactions;

(1)只在D层使用事务

  1. //设定事务的级别
  2. TransactionOptions option = new TransactionOptions();
  3. option.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
  4. using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, option))
  5. {
  6. //标志是否更改成功
  7. bool flag = false;
  8. bool flagUpdate = false;
  9. //更新Table1中数据
  10. string sqlUpText = "UPDATE Table1 SET actionReason = '1'";
  11. flagUpdate = sqlHelper.ExecuteNonQuery(sqlUpText,CommandType.Text);
  12. //更新Table2中数据
  13. string sqlText = "UPDATE Table2 SET isAvailable ='否' ";
  14. flag = sqlHelper.ExecuteNonQuery(sqlText, CommandType.Text);
  15. if (flag && flagUpdate)
  16. {
  17. ts.Complete();
  18. return true;
  19. }
  20. else {
  21. return false;
  22. }
  23. }

(2)事务在B层的使用
B层代码

  1. //首先引用 System.Data和System.Data.SqlClient命名空间
  2. //定义事务执行所使用的链接
  3. SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["strConnDB"].ToString());
  4. //打开连接
  5. sqlCon.Open();
  6. //定义事务
  7. SqlTransaction sqlTran = sqlCon.BeginTransaction(IsolationLevel.ReadCommitted);
  8. //用try...Catch...finally保证事务在出错时会回滚
  9. try
  10. {
  11. //向课程表中添加数据
  12. OptionalCourseScheduleLinkDAL OptionalCourseSchedule = new OptionalCourseScheduleLinkDAL();
  13. //将新建立的连接和事务一起传回D层
  14. IsAddOptionalCourseSchedule = OptionalCourseSchedule.AddOptionalCourseSchedule(enOptionalCourseSchedule,sqlCon,sqlTran);
  15. //更新授课关系表中的单双周
  16. CourseTeachClassLinkDAL CourseTeachClass = new CourseTeachClassLinkDAL();
  17. //添加D层的方法,调用sqlHelper中执行事务的方法:ExecNoSelect(string cmdText, SqlParameter[] paras, CommandType cmdType, SqlConnection sqlConns, SqlTransaction sqlTran)
  18. //将新建立的连接和事务一起传回D层
  19. IsUpdateCourseTeachClass = CourseTeachClass.UpdateCourseTeachClassOddEven(enCourseTeachClass,sqlCon,sqlTran);
  20. //若添加和更新有一者返回false,事务回滚
  21. if (IsAddOptionalCourseSchedule && IsUpdateCourseTeachClass)
  22. {
  23. //如果都为真,提交
  24. sqlTran.Commit();
  25. sqlCon.Close();
  26. return true;
  27. }
  28. else {
  29. sqlTran.Rollback();
  30. }
  31. }
  32. catch (Exception)
  33. {
  34. //出现异常时,事物回滚
  35. sqlTran.Rollback();
  36. }
  37. finally {
  38. sqlCon.Close();
  39. }
  40. return false;

D层代码

  1. public Boolean AddOptionalCourseSchedule(OptionalCourseScheduleLinkEntity enOptionalCourseScheduleLink, SqlConnection sqlCon, SqlTransaction sqlTran)
  2. {
  3. //声明一个布尔型变量
  4. Boolean blnIsResult = false;
  5. //执行SQL字符串名
  6. string strSQL = "insert into TBR_OptionalCourseScheduleLink(TeachClassID,RoomID,WorkDay,ClassBegin,ClassEnd) VALUES(@TeachClassID,@RoomID,@WorkDay,@ClassBegin,@ClassEnd)";
  7. //字符串数组
  8. SqlParameter[] param = new SqlParameter[]
  9. {
  10. new SqlParameter("@TeachClassID",enOptionalCourseScheduleLink.TeachClassID),//虚拟班ID
  11. new SqlParameter("@RoomID",enOptionalCourseScheduleLink.RoomID),//房间ID
  12. new SqlParameter("@WorkDay",enOptionalCourseScheduleLink.WorkDay),//星期
  13. new SqlParameter("@ClassBegin",enOptionalCourseScheduleLink.ClassBegin),//开始时间(如:上午第一节)
  14. new SqlParameter("@ClassEnd",enOptionalCourseScheduleLink.ClassEnd)//结束时间
  15. };
  16. //SQL语句类型
  17. CommandType cmdType = CommandType.Text;
  18. //SQLHELPER函数返回值
  19. blnIsResult = sqlHelper.ExecNoSelect(strSQL, param, cmdType, sqlCon, sqlTran);
  20. //返回函数值
  21. return blnIsResult;
  22. }

SqlHelper中关于事务的代码

  1. #region 执行sql语句(事务中使用)
  2. /// <summary>执行sql语句(事务中使用)
  3. /// 执行sql语句(事务中使用)
  4. /// </summary>
  5. /// <param name="cmdText">在事务中执行的某个SQL语句或存储过程</param>
  6. /// <param name="paras">参数集合</param>
  7. /// <param name="cmdType">命令类型</param>
  8. /// <param name="sqlConn">数据库连接</param>
  9. /// <param name="sqlTran">事务</param>
  10. public Boolean ExecNoSelect(string cmdText, SqlParameter[] paras, CommandType cmdType, SqlConnection sqlConns, SqlTransaction sqlTran)
  11. {
  12. try
  13. {
  14. //实例化数据库命令SqlCommand
  15. sqlCmd = new SqlCommand(cmdText, sqlConns);
  16. //命令类型:存储过程or SQL语句
  17. sqlCmd.CommandType = cmdType;
  18. //添加参数
  19. sqlCmd.Parameters.AddRange(paras);
  20. //事务
  21. sqlCmd.Transaction = sqlTran;
  22. //定义事务执行结果
  23. int intResult = sqlCmd.ExecuteNonQuery();
  24. //执行事务:大于0返回true,否则返回false。
  25. if (intResult > 0)
  26. {
  27. //事务执行成功
  28. return true;
  29. }
  30. else
  31. {
  32. //事务执行失败
  33. return false;
  34. }
  35. }
  36. catch (Exception ex)
  37. {
  38. //抛出异常
  39. throw ex;
  40. }
  41. }
  42. #endregion

c#中事物使用的更多相关文章

  1. [原创]java WEB学习笔记109:Spring学习---spring中事物管理

    博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好 ...

  2. JAVA中事物以及连接池

    一.事物 什么是事物? 事务,一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元.这些单元要么全都成功,要么全都不成功. 做一件事情,这个一件事情中有多个 ...

  3. SSM-Spring-21:Spring中事物的使用案例

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 股票买卖案例(我会用三种开启事物的方法 代理工厂bean版的,注解版的,aspectj xml版的) 简单的介 ...

  4. 转:Spring中事物管理

    1.什么是事务? 事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败 2.事物具有四大特性ACID 说到事务,就不得不说其4大特性,主要如下 原子性:(atomicity) 原子性指的是事务是 ...

  5. MySQL中事物的详解

    1. 事物的定义及特性 事务是一组操作数据库的SQL语句组成的工作单元,该工作单元中所有操作要么同时成功,要么同时失败.事物有如下四个特性,ACID简称“酸性”. 1)原子性:工作单元中所有的操作要么 ...

  6. Oracle在Java中事物管理

    对于 对数据库中的数据做dml操作时,能够回滚,这一事物是很重要的 下面例子是对数据库中数据进行修改 package com.demo.oracle; import java.sql.Connecti ...

  7. Oracle中事物处理--事物隔离级别

    n  事物隔离级别 概念:隔离级别定义了事物与事物之间的隔离程度. ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别(这是国际标准化组织定义的一个标准而已,不同的数据库在实现时有所不同) ...

  8. sqlserver中 事物 索引及视图

      事务 1.什么是事务 事务是一个不可分割的工作逻辑单元,它包含了一组数据库的操作命令,并且所有命令作为一个整体一起向系统提交或撤销操作请求,即要么都执行,要么都不执行 2.事务的4个属性 (1). ...

  9. spring boot 中事物的使用

    一.什么是事务? 事务,通俗的说就是,同时做多个事,要么全做,要么不做,也是其特性.举个例子来说,好比你在某宝.某东.某多上购物,在你提交订单的时候,库存也会相应减少,不可能是钱付了,库存不减少,或者 ...

随机推荐

  1. jQuery学习之:Validation表单验证插件

    http://polaris.blog.51cto.com/1146394/258781/ 最近由于公司决定使用AJAX + Struts2来重构项目,让我仔细研究一下这两个,然后集中给同事讲讲,让每 ...

  2. to_string()的应用

    作用是将数字转化为字符串 #include<iostream> #include<cmath> #include<algorithm> #include<cs ...

  3. [机器学习] 虚拟机VMware中使用Ubuntu的联网问题

    在VMware中安装Ubuntu要解决两个问题: 1.VMware Tools安装使用 2.Ubuntu联网的虚拟机设置 1.VMware Tools安装 它的作用就是使用户可以从物理主机直接往虚拟机 ...

  4. 踩坑事件:windows操作系统下的eclipse中编写SparkSQL不能从本地读取或者保存parquet文件

    这个大坑... .... 如题,在Windows的eclipse中编写SparkSQL代码时,编写如下代码时,一运行就抛出一堆空指针异常: // 首先还是创建SparkConf SparkConf c ...

  5. 关于Openlayer3的菜鸟认识

    什么是OpenLayers? OpenLayers 是一个专为Web GIS 客户端开发提供的JavaScript 类库包,用于实现标准格式发布的地图数据访问.从OpenLayers2.2版本以后,O ...

  6. How does Unity.Resolve know which constructor to use?

    Question: Given a class with several constructors - how can I tell Resolve which constructor to use? ...

  7. HTLM5表单

    1.HTML5占位符文本   使用placeholder可以给文本框,搜索框添加提示性文本 <input type="text" name="url" p ...

  8. MongoDB-3.2.6 副本集 和主从

    yum实例 vim /etc/yum.repos.d/mongodb-org-3.2.repo [mongodb-org-3.2] name=Mongodb baseurl=http://repo.m ...

  9. split函数的实现

    split作为字符串分割函数非常有用,但在C++里面没有这个函数.自己实现一个分割函数: 1.遇到多个分隔符连在一起,则不做分割 2.()内的分隔符不起作用 3.如果只有(,没有)不影响分隔符 #in ...

  10. 多线程相关------事件Event

    Event可以实现不同进程中的线程同步. 相关函数: CreateEvent创建或打开一个事件对象 HANDLE WINAPI CreateEvent( _In_opt_ LPSECURITY_ATT ...