数据库事务(简称: 事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。当事务被提交给了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. Android -- 自定义控件(ImageButton)

    1. 效果图

  2. ZeroMQ接口函数之 :zmq_msg_send – 从一个socket发送一个消息帧

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_msg_send zmq_msg_send(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ ...

  3. Java web servlet 拦截器 以登陆为例子

    以登陆为例子............... public class LoginFilter implements Filter { @Override public void destroy() { ...

  4. EasyUI配置和组件

    首先在webcontent添加配置文件 新建静态或动态网站,在title的下面加入五个配置文件路径,注意:循序不能乱 <!-- 顺序不可以乱 --> <!-- 1.jQuery的js ...

  5. 2016huasacm暑假集训训练四 DP_B

    题目链接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/M 题意:有N件物品和一个容量为V的背包.第i件物品的费用是体积c[i],价值是w[ ...

  6. PDMS模型导出RVM格式

    2 .将PDMS中对象模型导出为RVM格式的宏文件代码如下: eg:如果要导出某几个房间内的全部bran equi !strus = array()!strus.append(|/1RXR246ZL| ...

  7. C中嵌入python

    嵌入 与python的扩展相对,嵌入是把Python解释器包装到C的程序中.这样做可以给大型的,单一的,要求严格的,私有的并且(或者)极其重要的应用程序内嵌Python解释器的能力.一旦内嵌了Pyth ...

  8. 视觉机器学习读书笔记--------BP学习

    反向传播算法(Back-Propagtion Algorithm)即BP学习属于监督式学习算法,是非常重要的一种人工神经网络学习方法,常被用来训练前馈型多层感知器神经网络. 一.BP学习原理 1.前馈 ...

  9. JMeter学习-036-JMeter调试工具之三---Debug Sampler

    前面两篇文章分别讲述了 HTTP Mirror Server 和 Debug PostProcessor 的脚本调试实例.此文主要讲述第三种调试工具:DebugSampler,其主要是查看JMeter ...

  10. 监控redis python脚本

    #!/bin/env python #-*- coding:utf- -*- import json import time import socket import os import re imp ...