Ado.Net事务处理。
在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务。若要执行事务,请执行下列操作:
• 调用Connection 对象的BeginTransaction 方法来标记事务的开始。
• 将Transaction 对象分配给要执行的Command的Transaction 属性。
• 执行所需的命令。
• 调用Transaction 对象的Commit 方法来完成事务,或调用Rollback 方法来取消事务。
当然ADO.NET事务处理有优点和缺点,运用起来看具体情况了。
• 优点:
– 简单性
– 和数据据事务差不多的快
– 独立于数据库,不同数据库的专有代码被隐藏了
• 缺点:
– 事务不能跨越多个数据库连接
– 事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接。
下边我们看一个例子,建立一个页面,同样简单,只需要一个按钮,然后编程:

 1using System;
 2using System.Data;
 3using System.Configuration;
 4using System.Collections;
 5using System.Web;
 6using System.Web.Security;
 7using System.Web.UI;
 8using System.Web.UI.WebControls;
 9using System.Web.UI.WebControls.WebParts;
10using System.Web.UI.HtmlControls;
11using System.Data.SqlClient;
12
13namespace WebApplication1
14{
15    public partial class AdoAction : System.Web.UI.Page
16    {
17        protected void Page_Load(object sender, EventArgs e)
18        {
19
20        }
21
22        protected void btn_Click(object sender, EventArgs e)
23        {
24            SqlConnection con = new SqlConnection();
25            con.ConnectionString=ConfigurationManager.ConnectionStrings["DSN"].ConnectionString;
26            con.Open();
27            //启动一个事务。
28            SqlTransaction myTran = con.BeginTransaction();
29            //为事务创建一个命令,注意我们执行双条命令,第一次执行当然成功。我们再执行一次,失败。
30            //第三次我们改其中一个命令,另一个不改,这时候事务会报错,这就是事务机制。
31            SqlCommand myCom = new SqlCommand();
32            myCom.Connection = con;
33            myCom.Transaction = myTran;
34            try
35            {
36                myCom.CommandText = "insert into SqlAction values ('测试2','111')";
37                myCom.ExecuteNonQuery();
38                myCom.CommandText = "insert into SqlAction values ('测试3','111')";
39                myCom.ExecuteNonQuery();
40                myTran.Commit();
41                Response.Write("成功执行");
42
43            }
44            catch (Exception Ex)
45            {
46                myTran.Rollback();
47                //创建并且返回异常的错误信息
48                Response.Write(Ex.ToString());
49                Response.Write("写入数据库失败");
50            }
51            finally
52            {
53                con.Close();
54            }
55 
56        }
57
58
59    }
60} 
 
 
 

ADO.NET事务测试代码:

using(MySqlConnection conn = new MySqlConnection(GetConnection()))
        {
            conn.Open();
            //启动一个事务
            using(MySqlTransaction transaction = conn.BeginTransaction())
            {
                using (MySqlCommand cmd = conn.CreateCommand())
                {
                    try
                    {
                        cmd.Transaction = transaction;  //为命令指定事务
                        cmd.CommandText = "INSERT INTO tb_user(UserId,UserName) VALUE('Id0009','Name0002');";
                        cmd.ExecuteNonQuery();
                        cmd.CommandText = "INSERT INTO tb_user(UserId,UserName) VALUE('Id0008','Name0003');";
                        cmd.ExecuteNonQuery();
                        transaction.Commit();   //事务提交
                        Response.Write("<script>alert('成功写入记录');</script>");
                    }
                    catch(Exception ex)
                    {
                        transaction.Rollback(); //事务回滚
                        Response.Write(ex.Message);
                        Response.Write("<script>alert('写入记录失败');</script>");
                    }
 
                }
            }
        }

代码分析:

如示例代码手动创建ADO.NET事务步骤如下:

1)使用MySqlConnection类的BeginTransaction()方法返回一个MySqlTransaction类型的对象;

2)使用MySqlCommand类对象的Transaction属性将要参与事务处理的每条命令关联到上一不返回的MySqlTransaction类型的对象上;

3)如果事务可以成功完成,使用MySqlTransaction对象的Commit()方法提交事务处理结果;

4)如果事务处理中发生错误,就调用MySqlTransaction对象的Rollback()方法,撤销每一个修改。


ADO.NET事务的缺点;

ADO.NET事务只能处理关联到一个连接上的本地事务,不支持跨多个连接的事务。(为了克服这一缺点,下一节将介绍基于System.Transaction命名空间的分布式事务)。

ADO 事务的更多相关文章

  1. ActiveX数据对象之事务控制在VB和DELPHI中的应用

            本文发表在中国人民解放军"信息工程大学"学报 2001年第3期.        ActiveX数据对象之事务控制在VB和DELPHI中的应用             ...

  2. SQL Server 2008 R2——VC++ ADO 操作 事务

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  3. ADO.NET中的TransactionScope何时需要启用MSTDC(分布式事务管理)

    我们知道在ADO.NET中可以用TransactionScope来将多个SqlConnection(多个数据库连接)执行的Sql语句放入一个事物中提交或取消,但是使用TransactionScope的 ...

  4. ADO.NET笔记——执行事务

    相关知识: 处于同一事务(Transaction)内的一组操作,要么都成功执行,最后完全提交:但如果只要有任何一个操作失败或者出问题,所有值钱执行的操作也都取消并恢复到初始状态(即回滚) SqlTra ...

  5. ADO.NET 快速入门(七):使用数据库事务

    数据库事务用于控制数据提交到数据库.例如,在标准的账户程序,账户的借贷必须同时完成.由于电脑偶尔发生故障(电力中断.网络中断,等等),可能有些记录被更新或者添加,但是另外一些没有.为了避免这些情况,可 ...

  6. ADO.NET中使用事务进行数据库读写的办法

    使用事务一般是进行数据写入,数据读取一般是不需要这货的 第一种办法: 使用存储过程: 顾名思义,在存储过程中定义好变量,定义好事务开始,结束,错误回滚然后在ADO.NET中正常调用存储过程的方法就行 ...

  7. 30、ADO.NET、事务、DataSet

    ADO.NET ADO.NET是一组用于和数据源进行交互的面向对象类库.通常数据源是数据库,但也可以是文本文件.Excel表格.XML文件. 说白了就是使用.net操作数据库的一套类库. ADO.NE ...

  8. ADO.NET系列之事务和调用存储过程

    ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 前几篇我们介绍了Conne ...

  9. ADO.NET事务

    在发布System.Transaction命名空间之前,可以直接用ADO.NET创建事务,也可以通过组件.特性和COM+运行库(位于System.EnterpriseServices命名空间中)进行事 ...

随机推荐

  1. Eclipse中项目面板字体的修改

    修改eclipse安装目录中的如下文件,添加黄色标记部分,并设定自己需要的字体大小(这里是10px)即可: \eclipse\plugins\org.eclipse.ui.themes_1.1.1.v ...

  2. javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)

    最后一例,搞得快.三天之内走了一次.. 下一步,面象对像的javascript编程. function Dictionary(){ var items = {}; this.has = functio ...

  3. APP性能分析1

    我们使用云测试平台对产品进行了性能测试,情况如下:   详见这里.

  4. SQLServer备份脚本

    企业管理器--管理--SQL Server代理--右键作业--新建作业--"常规"项中输入作业名称--"步骤"项--新建--"步骤名"中输入 ...

  5. 利用mapreduce将数据从hdfs导入到hbase遇到的问题

    现象: 15/08/12 10:19:30 INFO mapreduce.Job: Job job_1439396788627_0005 failed with state FAILED due to ...

  6. dos基本命令

    dir   :列出当前目录下的文件及文件夹 md  :插件目录 rd   :删除目录 cd   :进入指定目录 cd.. :退回到上一级目录 cd/  :退回到根目录 del   :删除文件 exit ...

  7. Android 建立文件夹、生成文件并写入文本文件内容

    一.首先添加权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">& ...

  8. LIS HDOJ 1257 最少拦截系统

    题目传送门 题意:中文题面 分析:LIS模板题:n - 最长下降子序列 -> 最长上升子序列 贪心做法以后再补:) 代码: #include <cstdio> #include &l ...

  9. 数学+高精度 ZOJ 2313 Chinese Girls' Amusement

    题目传送门 /* 杭电一题(ACM_steps 2.2.4)的升级版,使用到高精度: 这次不是简单的猜出来的了,求的是GCD (n, k) == 1 最大的k(1, n/2): 1. 若n是奇数,则k ...

  10. JS生成随机的由字母数字组合的字符串

    前言 最近有个需求,是需要生成3-32位长度的字母数字组合的随机字符串,另一个是生成43位随机字符串. 方法一 奇妙的写法   1 Math.random().toString(36).substr( ...