数据库事务(简称: 事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。当事务被提交给了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. Why do we live in this world?

    Why do we live in this world? It seems to me there is nothing but two reasons, - to live the livabil ...

  2. Markdown工具的使用

    Markdown 工具的使用 基本操作 CMD-N 建立一个新的工作表 CMD-SHIFT-N 建立一个新的组 CMD-CTRL-N 建立一个新的过滤器 项目总是会被创建在当前所选的附近 工作表会被创 ...

  3. 2016最新 wamp2.5+windows 10安装CoedSgniffer代码格式检查:5分钟安装 30分钟入门和浏览常用命令

    14:59 2016/1/112016最新 wamp2.5+windows 10安装CoedSgniffer代码格式检查:注意问题:1.手动安装2.5.0和pear安装方式都成功但是执行时无任何反映, ...

  4. MySQL生成模型

    根据数据库表生成Model using System; using System.Collections.Generic; using System.Data; using System.Text; ...

  5. UILabel笔记(待完善)

    UIlabel的换行由 numberOfLines 属性控制,当为0时,则会自动换到适合的行数: 换行的模式由 lineBreakMode 属性控制: public enum NSLineBreakM ...

  6. delphi URL 编码的转换

    先介绍一下,Delphi中处理Google的URL编码解码,其中就会明白URL编码转换的方法的 从delphi的角度看Google(谷歌)URL编码解码方式 在网上搜索了一下,似乎没有什么关于goog ...

  7. html基本选择符的使用

    一.选择符在运用在CSS设计样式时对HTML的指定有至关重要的作用! 二.研究 普通选择符: 1.类型选择符:它可以选择同一个类型的元素! 例如:h1,h2 {              color: ...

  8. FTP传输文件

    感谢其他技术人员的分享.我转发,添加个人使用. public class TransFTP {/// <summary> /// 上传文件 /// </summary> /// ...

  9. 微信 {"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"}

    {"errcode":,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]" ...

  10. 【转】NGUI研究院之三种方式监听NGUI的事件方法(七)

    NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定在按钮上,当按钮点击时就可以监听到,这种方法不太好很不 ...