数据库事务(简称: 事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。当事务被提交给了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事件:鼠标移入移出(mouseenter,mouseleave)

    前几天帮朋友做了一个单页面,其中有个效果就是鼠标移动到头像上变换头像样式,当鼠标移出时恢复头像样式.当时没多想,脑子就蹦出了mouseover,mouseout两个方法. 但是在编写页面的过程中,无论 ...

  2. MongoDB使用小结:一些常用操作分享

    本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell.pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程. MongoDB的使用之前也分享过一篇, ...

  3. C#对图片的操作

    1.根据图片路径返回字节 public static byte[] getImageByte(string imagePath) { FileStream files = new FileStream ...

  4. 经典.net面试题目

    1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private :   私有成员, 在类的内部才可以访问. protected : 保 ...

  5. [LintCode] Single Number 单独的数字

    Given 2*n + 1 numbers, every numbers occurs twice except one, find it. Have you met this question in ...

  6. Django视图与网址

    Django中网址是写在 urls.py 文件中,用正则表达式对应 views.py 中的一个函数(或者generic类),我们用一个项目来演示. 下载本节所有源代码: 学习编程最好的办法就是动手敲代 ...

  7. 实战java虚拟机的学习计划图(看懂java虚拟机)

    啥也不说了,实战java虚拟机,好好学习,天天向上!针对自己的软肋制定学习计划. 一部分内容看完,自己做的学习笔记和感想. 学java很简单,但懂java会有难度,如果你的工资还没超过1W,那是时候深 ...

  8. xdebug所有相关方法函数详解(中文翻译版)

    此次翻译部分借助google翻译,如有错误,请联系qq:903464207反馈问题,或者留言反馈 翻译时间:2016年4月18日09:41:34 xdebug.remote_enable = onxd ...

  9. How to install starDIct on suse OS?

    1. Access page http://code.google.com/p/stardict-3/ to download starDict package or use zypper in to ...

  10. ajax跨域通过 Cors跨域资源共享 进行GetPost请求

    using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne ...