事务处理基本原理      
      事务是将一系列操作作为一个单元执行,要么成功,要么失败,回滚到最初状态。在事务处理术语中,事务要么提交,要么中止。若要提交事务,所有参与者都必须保证对数据的任何更改是永久的。不论系统崩溃或是发生其他无法预料的事件,更改都必须是持久的。只要有一个参与者无法做出此保证,整个事务就会失败。事务范围内的所有数据更改将回滚到特定设置点。


      事务将多个操作紧密联系到一起,这样就能保证有联系的两种操作的一致性、以及数据的完整性。举个简单例子:公司的员工信息管理系统,现在要录入数据,员工信息系统假设只有部门、员工信息两张表,其中员工信息表中有标识部门的字段。在你录入信息的时候首先你得录入部门信息,再录入员工信息。具体实现代码:

private static void ExecuteSqlTransaction(string connectionString){using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();SqlCommand command = connection.CreateCommand();SqlTransaction transaction;  transaction = connection.BeginTransaction("SampleTransaction");command.Connection = connection;command.Transaction = transaction;try{command.CommandText ="Insert into Department (ID, Name) VALUES (1, '工程部')";command.ExecuteNonQuery();command.CommandText ="Insert into Users(ID, Name,DepartmentID) VALUES (1, 'xyz',1)";command.ExecuteNonQuery();transaction.Commit();}catch (Exception ex){transaction.Rollback();}}}

 事务的误区

事务有很多优点【原理中已经阐述】,由于它的要求比较高,所以注意事务不能滥用,如果用不好就会造成很大的麻烦。

事务有一个开头和一个结尾,它们指定了事务的边界,事务在其边界之内可以跨越进程和计算机。事务边界内的所有资源都参与同一个事务。要维护事务边界内资源间的一致性,事务必须具备 ACID 属性,即原子性、一致性、隔离性和持续性。这是MSDN的权威说明。

也许针对一般的小逻辑、小数据事务应用非常的高效、可靠。但如果数据量很大,在单个事务中集合的操作繁多而且复杂,事务的致命伤就会暴露出来。一个事务进行时,必须保证边界资源的原子性、一致性、隔离性和持续性。

我曾经设计了一个测试用例,测试事务在执行时对资源的利用情况。测试结果很令人惊讶:在事务执行时,独占事务涉及到的数据表,造成其它操作词表的功能,因等待时间过长,而暴跳“获得数据连接超时”的警告。

具体的测试用例:

 public class TestTransaction{/// <summary>/// 插入新用户/// </summary>/// <param name="tran"></param>/// <returns></returns>private static bool InsertIntoUser(SqlTransaction tran){string strSql = @"INSERT INTO [T_User]([F_Name])VALUES(@F_Name)";SqlParameter[] Params ={ new SqlParameter("@F_Name", SqlDbType.VarChar, 20) };Params[0].Value="Test1001";int count= SqlHelper.ExecuteNonQuery(strSql,Params,tran);if (count > 0){return true;}else{return false;}}/// <summary>/// 插入title/// </summary>/// <returns></returns>private static bool InsertIntoTitle(SqlTransaction tran){string strSql = @"INSERT INTO [T_User_Title]([F_TitleName],[F_Remark],[F_Status],[F_EditTime])VALUES(@F_TitleName,@F_Remark,@F_Status,@F_EditTime)";SqlParameter[] Params = { new SqlParameter("@F_TitleName",SqlDbType.VarChar, 50), new SqlParameter("@F_Remark", SqlDbType.VarChar, 200), new SqlParameter("@F_Status", SqlDbType.Int, 1), new SqlParameter("@F_EditTime", SqlDbType.DateTime, 8) };Params[0].Value = "TestUser1001";Params[1].Value = "这是第一次测试";Params[2].Value = 1;Params[3].Value = DateTime.Now;int count = SqlHelper.ExecuteNonQuery(strSql,Params,tran);if (count > 0){return true;}else{return false;}}/// <summary>/// 检测Transaction/// </summary>/// <returns></returns>public static bool InsertWithTran(){bool success = false;string connectionString=System.Configuration.ConfigurationSettings.AppSettings["SqlConStr"].ToString();using (SqlConnection con = new SqlConnection(connectionString)){con.Open();SqlTransaction tran = con.BeginTransaction();try{  if (tran == null){throw new Exception("Transaction is null");}if (InsertIntoUser(tran)){if (InsertIntoTitle(tran)){tran.Commit();success = true;}}}catch{tran.Rollback();success = false;}finally{tran.Dispose();con.Close();}}return success;}}
 protected void Button1_Click(object sender, EventArgs e){bool success = TestTransaction.InsertWithTran();if (success){Bmc.CLUtility.ShowMessage(this.Page, "插入成功");            }else{Bmc.CLUtility.ShowMessage(this.Page, "插入失败");}}
<1>运行程序
<2>将运行的地址,发给在同一个网段的同事,通过适当修改也能够看到你运行的程序
<3>两人都点击按钮,并查询数据库,看事务是否正确执行
<4>在事务中间创建断点,主机点击按钮,并在断点处中断执行一段时间
<5>然后你们连接到数据库,分别查询表的数据,发现不能执行查询操作。
<6>在同事机器点击按钮,查询windows日志,发现了一些警告
这就证明了,事务在执行过程中,独占资源

SqlTransaction——事务详解相关推荐

  1. SqlTransaction——事务详解 [转]

    事务处理基本原理             事务是将一系列操作作为一个单元执行,要么成功,要么失败,回滚到最初状态.在事务处理术语中,事务要么提交,要么中止.若要提交事务,所有参与者都必须保证对数据的任 ...

  2. SpringBoot事务详解

    文章目录 一.简介 1.介绍 2.事务特点 3.事务实现方式 3.1 MySql事务实现方式 3.2 SpringBoot实现机制 二.@Transactional详解 1.@Transactiona ...

  3. mysql dba系统学习-数据库事务详解

    mysql dba系统学习-数据库事务详解 上个星期去面试数据库管理员的工作,笔试通过之后就是直接的面试,他问了我一个问题,叫我介绍哈数据库的事务的看法和理解,但是不知所错的没有章法的乱答一气,唉唉, ...

  4. java JDBC事务和JTA事务详解

    什么是事务? 事务其实就是一套数据库操作集合,说到事务就不得不说它的四大特性(A C I D):原子性,一致性,隔离性,持久性.事务的原子性表示事务要么被全部执行,要么被全部不执行.如果事务下的子事务 ...

  5. 什么是ZooKeeper?可以做什么?ZooKeeper分布式事务详解篇

    前言 什么是ZooKeeper,你真的了解它吗.我们一起来看看吧~ 一.什么是 ZooKeeper? ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务 ...

  6. Spring源码(八):Spring事务详解

    Spring事务详解 一.事务执行流程 二.Spring事务切面 三.事务切面的Pointcut和Advice 四.注解事务的源码分析 五.Sping事务的传播属性 六.Sping事务的异常校验 七. ...

  7. php redis事务回滚,【Redis】Redis事务详解,Redis事务不支持回滚吗?

    1.redis事物参考:https://baijiahao.baidu.com/s?id=1613631210471699441&wfr=spider&for=pc (php操作red ...

  8. ShardingShpere分库分表5-ShardingSphere分布式事务详解

    文章目录 一.ShardingJDBC分布式事务快速上手 LOCAL本地事务 XA事务快速上手 BASE柔性事务快速上手 seata部署方式: 客户端使用Base事务 二.分布式事务原理详解 XA事务 ...

  9. spring事务详解

    Spring事务总结 参考 首先,如果整个系统要能实现事务,需要两个方面: Spring开启了事务 MySQL 数据库默认使用支持事务的innodb引擎 1.什么是事务? 事务是逻辑上的一组操作,要么 ...

最新文章

  1. Java泛型的类型擦除
  2. C++代码在Sublime Text 3中编译和运行
  3. 19行代码AC——例题 6-2 铁轨(Rails, UVa 514)——解题报告
  4. 判断位数(Java)
  5. 腾讯想拿到Big Data资源,8h删抓紧时间!!
  6. [C++基础]031_如何正确获取用户的输入
  7. 日常工具搬运——python逐行写入txt文件
  8. 计算机导论学后感5000字,大学计算机导论论文3000字.docx
  9. 信捷plc485通信上位机_STM32L476R快速入门——串口与上位机通信
  10. 在边缘试探的滴滴顺风车 凭什么在2019年再上线?
  11. 护照港澳通回乡证多功能证件识别阅读器MEPR100接口函数的定义
  12. iOS 玩不转的GCD第0课时
  13. android 调出键盘表情_Android 显示输入法中的emoji表情以及String字符
  14. 再获2亿元A+轮融资,乐生智能能否“扫出”舒适区?
  15. go语言开发工具sublime text3 + gosublime配置
  16. UEFI与MBR区别
  17. 超多面试题合集,来瞅瞅你碰到了几道题~
  18. faile什么意思_fail是什么意思_fail在线翻译_英语_读音_用法_例句_海词词典
  19. 应用计算机金融 pdf,2041计算机在金融业中地应用答案.pdf
  20. 引用程序集没有强名称的解决办法

热门文章

  1. 这篇文章说出了研究生和导师的相处真谛……
  2. NC:蜜蜂肠道微生物的多样性
  3. QIIME1.9.1-2使用Docker运行QIIME
  4. 宏基因组-微生物组文章目录索引(1803)
  5. Error in match.names(clabs, names(xi)) : names do not match previous names
  6. R语言plot函数可视化、ggplot2可视化把图像标题(title)的部分内容着色实战:标题的部分内容配置不同的色彩、副标题(subtitle)的内容配置不同的色彩
  7. R构建鲁棒回归模型(Robust Regression)
  8. groupby+(apply+agg+transform)方法的比较
  9. Linux aptget 参数,ubuntu下apt-get 命令参数大全
  10. MATLAB中PI调节器设计,华中科技大学电气学院matlab选修课大作业pi控制器的设计...