数据库事务(简称: 事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。当事务被提交给了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. a 标签 启用或禁用点击事件

    <a href="#" id="btnAuthCode" class="authCode_btn">获取验证码</a> ...

  2. Android SDK下载和更新失败的解决方法

    解决国内访问Google服务器的困难启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - Se ...

  3. MySQL sql_safe_updates 分析

    我在练习MySQL操作语句时,使用一条完全没有错误的语句: update students set name='drake' where name='chuan'; 却报了如下错误: Error Co ...

  4. Daikon Forge GUI Library(dfgui)之Event Binding

    点击按钮并弹出对话框,就用下面的大问题按钮吧 1,选中按钮,Component/Daikon Forge/Data Binding/Event Binding 2,UI上创建DfPanel,并将其Be ...

  5. WPF整理-使用逻辑资源

    "Traditional application resources consist of binary chunks of data, typically representing thi ...

  6. poj1664-放苹果(递归)

    一,题意: M个苹果放在N个盘子里,允许有盘子空着,问共有多少种不同的分法. 二,思路: 递归的思想求解: 1,有反复执行的过程(调用本身) 第一种情况n>m : 必定有 n-m 个盘子空着,去 ...

  7. HDU 3966 & POJ 3237 & HYSBZ 2243 树链剖分

    树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...

  8. 百度网盘生成二维码api

    分享出自精神,灵感来自大脑,在百度云网盘分享每一个文件,都会在页面生成一个二维码扫描的图片: 我就进一步看了该图片的地址: 发现没有,圈圈内是不是有点眼熟,就跟其他二维码api接口一样,只要盗用这段东 ...

  9. JBoss QuickStart之Helloworld

    下载Jboss, quickstart, 按照quickstart说明, mvn clean install. 由于ssl handshake问题(应该是网络连接不稳定), 写了一个脚本不停地尝试bu ...

  10. android的程序运行数据存放在哪里?

    Android应用开发中,给我们提供了5种数据的存储方式1 使用SharedPreferences存储数据2 文件存储数据3 SQLite数据库存储数据4 使用ContentProvider存储数据5 ...