1、事务是什么?
            事务是应用程序中一系列严密的操作,所有的操作必须全部成功完成,否则每个操作中的所有更改都会被撤销。也就是事务具有原子性,一个事务中的一系列操作要么全部成功,要么一个都不做。
 2.事务的四大特性
            数据库事务 transanction 正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。

      (1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成。事务在执行过程中发生错误,会被回滚(Rollback)撤销操作。
                     (2)一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
           (3)隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系          统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
           (4)持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

步入正题,我们经常遇到在对数据进行增、删、改操作的同时去操作其他数据,以插入一条数据的同时更新另一张表数据为例,
那么在ASP.NET(C#)程序当中我们怎么样来应用呢?我们来看代码:

         public bool Insert(SC_CJ_MRBBModel model)
{
//创建数据库连接对象
using (SqlConnection conn=new SqlConnection(SqlHelper.SCConnString /*数据库连接字符串*/))
{
conn.Open(); //打开连接
//开启事务:标志事务的开始
using (SqlTransaction tran=conn.BeginTransaction())
{
try
{
//Insert
string sqlStr = "insert into tableA values(@BZ,@CJRQ,FDCS)";
SqlParameter[] parm = {
new SqlParameter("@BZ",NumericParse.IsStringNull(model.BZ)),
new SqlParameter("@BZ",NumericParse.IsDateNull2(model.CJRQ)),
new SqlParameter("@BZ",NumericParse.IsStringNull(model.FDCS))
};
int count = SqlHelper.ExecuteNonQuery(tran, CommandType.Text, sqlStr.ToString(), parm); #region 不使用SqlHelper辅助类的情况下
////创建命令对象
//SqlCommand cmd = new SqlCommand(sqlStr, conn);
////通过Parameter集合的add()方法天填充参数集合
//cmd.Parameters.Add(parm);
//cmd.Transaction = tran;
//int count = cmd.ExecuteNonQuery();
#endregion //Update
string uptSqlStr = $"update tableB set A=@BZ where ID=@ID";
SqlParameter[] spr = {
new SqlParameter("@BZ",NumericParse.IsStringNull(model.BZ)),
new SqlParameter("@ID",NumericParse.IsStringNull(model.BZ))
};
SqlHelper.ExecuteNonQuery(tran, CommandType.Text, uptSqlStr.ToString(), spr); if (count > )
{
//如果Insert成功,则提交事务
tran.Commit();
return true;
}
else
{
return false; //tran.Rollback(); 这里直接Rollback也可以
}
}
catch (Exception ex)
{
//如果Insert数据出现问题,则将整个事务回滚
tran.Rollback();
LogHelper.ErrorLog(ex.Message);
return false;
throw ex;
}
finally
{
if (conn.State == ConnectionState.Open && conn != null)
{
conn.Close();
conn.Dispose(); //关闭连接,释放资源
}
}
}
}
}

 总结:一、asp.net(c#)开启事务的步骤:

          01.调用SqlConnection对象的BeginTransaction()方法,创建一个SqlTransaction对象,标志事务开始。
          02.将创建的SqlTransaction对象分配给要执行的SqlCommand的Transaction属性。
          03.调用相应的方法执行SqlCommand命令。
          04.调用SqlTransaction的Commit()方法完成事务。或调用Rollback()方法终止事务。

   二、在进行事务操作中的注意点
    01.在调用BeginTransaction()方法开始事务之前,要打开数据库连接,否则出现异常。
    02.如果在事务的Commit()方法或RollBack()方法执行前数据库连接断开或关闭,则事务将回滚。

Don't lose hope. You never know what tomorrow will bring.

ASP.NET(C#)事务的创建、提交以及回滚 (附代码)的更多相关文章

  1. J2EE分布式事务中的提交、回滚方法调用异常。

    这个是昨天上班的时候,写一个后台程序的调试程序时碰到的问题,和项目经理纠结了一天,最后搞定了.于是今天上班正好闲着,花了几乎一天的时间去网上找各种相关的资料.目前了解的内容如此: 根据使用的weblo ...

  2. CI框架的事务开启、提交和回滚

    1.运行事务 $this->db->trans_start(); // 开启事务$this->db->query('一条SQL查询...');$this->db-> ...

  3. JDBC03 利用JDBC实现事务提交与回滚【调用Connection中的方法实现事务管理】

    目录 1 Connection中的重用方法 2 JDBC事务管理经典案例 1 Connection类中常用的方法回顾 1.1 Statement createStatement() throws SQ ...

  4. 【转】批量复制操作(SqlBulkCopy)的出错处理:事务提交、回滚

    原文地址:http://blog.csdn.net/westsource/article/details/6658109 默认情况下,批量复制操作作为独立的操作执行. 批量复制操作以非事务性方式发生, ...

  5. 如何在mysql下实现事务的提交与回滚

    最近要对数据库的数据进行一个定时迁移,为了防止在执行过程sql语句因为某些原因报错而导致数据转移混乱,因此要对我们的脚本加以事务进行控制. 首先我们建一张tran_test表 CREATE TABLE ...

  6. RocketMQ源码分析之RocketMQ事务消息实现原下篇(事务提交或回滚)

    摘要: 事务消息提交或回滚的实现原理就是根据commitlogOffset找到消息,如果是提交动作,就恢复原消息的主题与队列,再次存入commitlog文件进而转到消息消费队列,供消费者消费,然后将原 ...

  7. java陷阱之spring事物未提交和回滚导致不可预知问题

    案发现场 //防止全局配置了 所以这里定义sprnig 不托管事物 @Transactional(propagation = Propagation.NOT_SUPPORTED) public boo ...

  8. 14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚

    14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚 如果自动提交模式被启用,在InnoDB里, 所有的用户活动发生在一个事务里, 每个SQL语句 ...

  9. BAPI总的数据库提交和回滚

    BAPI事物中的数据提交和回滚必须通过调用SAP标准业务对象BAPI SERVICE(对象类型SAP0001)的BAPI方法bapiservic.transactioncommit和bapiservi ...

随机推荐

  1. web页面ios浏览器img图片的坑

    大家都知道ios浏览器有个默认的内置事件,就是长按屏幕,会放大预览你点击的内容. 不同浏览器效果各异,有的浏览器弹出提示框,预览图片或保存图片.主要呈下面2中形式.体验最差的就是后者,会直接将页面中的 ...

  2. django之ajax结合sweetalert使用,分页器和bulk_create批量插入 07

    目录 sweetalert插件 bulk_create 批量插入数据 分页器 简易版本的分页器的推导 自定义分页器的使用(组件) sweetalert插件 有这么一个需求: ​ 当用户进行一个删除数据 ...

  3. BZOJ 3060: [Poi2012]Tour de Byteotia 并查集

    前 $k$ 个节点形成的结构必定是森林,而 $[k+1,r]$ 之间肯定是都连上,而剩下的一个在 $[1,k],$一个在 $[k+1,r]$ 的节点就能连多少连多少即可. Code: #include ...

  4. bzoj 4899 记忆的轮廓 题解(概率dp+决策单调性优化)

    题目背景 四次死亡轮回后,昴终于到达了贤者之塔,当代贤者夏乌拉一见到昴就上前抱住了昴“师傅!你终于回来了!你有着和师傅一样的魔女的余香,肯定是师傅”.众所周知,大贤者是嫉妒魔女沙提拉的老公,400年前 ...

  5. linux C线程

    一个应用程序可以启动若干个线程: 线程,是程序执行的最小单位: 一般一个最简单的程序最少有一个线程,就是程序本身,也是主函数: 一个线程阻塞不会影响另一个线程: 多线程的进程可以尽可能多的利用系统CP ...

  6. Java线程之FutureTask

    简述 FutureTask是Future接口的实现类,并提供了可取消的异步处理的功能,它包含了启动和取消(start and cancel)任务的方法,同时也包含了可以返回FutureTask状态(c ...

  7. react搭建项目

    1.创建react项目 使用react脚手架create-react-app npm install -g create-react-app create-react-app my-app cd my ...

  8. js计算textarea输入文字的长度

    前言 日常开发过程中,有些时候我们想使用textarea,然后限制输入的长度,在textarea末尾显示剩余可输入的字节数. 如下图:  解决方法: 常用的有三种方法: 1.通过判断charCodeA ...

  9. mybatis oracle mysql 批量插入时的坑爹问题--需谨记

    mybatis oracle mysql 批量插入一.oracle的批量插入方式insert into db(id, zgbh, shbzh) select '1', '2', '3' from du ...

  10. lockfree buffer test

    性能测试(3): 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试     版权声明:本文为博主zieckey原创文章, ...