事务-程序员的必经之路

    以前只是在数据库中使用了事务,但是并没有在代码中使用过事务,最近解决问题时正好有了这个需求,这会不能再放过它了。由于是初次使用首先进行了各种尝试,下面写我尝试过程中的一点点收获。


    事务大概可以分为四种:SQL事务,ADO.NET事务,TransactionScope事务,EnterpriseServices事务。

        SQL事务我们都很熟悉,这里不再赘述。

        EnterpriseServices比较不常见,我们也不再过多叙述。

    我把重点放到了ADO.NET实现事务和TransactionScope实现事务上。


    ADO.NET如何实现事务?

    调用Connection和Transaction对象来控制事务,首先调用Connection对象的Begin Transaction方法来标记事务的开始,然后将Transaction对象分配给要执行的Command的Transaction属性,最后执行所需命令(Transaction的Commit方法用来提交事务,Rollback方法用来取消事务)


    TransactionScope如何实现事务?

    在.NET 2.0中新添加了system.Transaction的命名空间,他提供了一个易于使用的操作事务的框架。它实现了自动提升事务机制PromoTransaction,会自动根据事务中涉及的对象资源判断使用何种事务管理器。TransactionScope事务类可以使代码成为事务性代码。


    试验背景

    建立数据库“shiyan”,数据库中有两张表Table1和Table2,每个表中都有两个字段id和name,其中table1中无主键,Table2中id作为主键。每次执行时我们的目的都是同时向两个表插入数据。


    DEMO(TransactionScope实现事务)

        无事务代码

<span style="font-size:18px;"><strong>                string connstring = "server =.;uid=sa;pwd=1;database=shiwu";
                SqlConnection conn = new SqlConnection(connstring);
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = "insert into table1 values(1,1)";
                //向表1中插入1,1
                cmd.ExecuteNonQuery ();

                cmd.CommandText = "insert into table2 values(2,2)";
                //向表二中插入2,2
                cmd.ExecuteNonQuery ();</strong></span>
        执行结果1

                1、第一次执行,成功。分别向Table1中Table2中插入了数据。

                2、第二次执行,失败。只向Table1中插入了数据(脏数据),插入Table2失败(Table2有主键约束)


        有事务代码

<span style="font-size:18px;"><strong>            try
            {

                //定义存储事务信息的对象
                TransactionOptions option = new TransactionOptions();
                //指定事务的隔离级别
                option.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; 
                //使下面的代码成为事务性代码
                using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, option))
            { 
                 //连接字符串
                string connstring = "server =.;uid=sa;pwd=1;database=shiwu";
                SqlConnection conn = new SqlConnection(connstring);
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = "insert into table1 values(1,1)";
                //向表1中插入1,1
                cmd.ExecuteNonQuery ();

                cmd.CommandText = "insert into table2 values(2,2)";
                //向表二中插入2,2
                cmd.ExecuteNonQuery ();
                //指示范围中的所有操作都已经完成
                ts.Complete();
                MessageBox.Show("成功");
            }

            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }</strong></span>


         执行结果2

                1、第一次执行,成功。分别向Table1中Table2中插入了数据。

                2、第二次执行,失败。Table1中和Table2中都没有插入数据符合一致性。

         注意:使用此事务时首先要导入命名空间system.Transaction


     DEMO(ADO.NET实现事务)

<span style="font-size:18px;"><strong>            string connstring = "server=.;uid=sa;pwd=1;database=shiwu";
            SqlConnection conn = new SqlConnection (connstring);
            conn.Open();
            //定义事务对象,并制定事务隔离级别
            SqlTransaction tx = conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted );

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;

            cmd.Transaction = tx;
            try
            {
                cmd.CommandText = "insert into table1 values(1,1)";
                cmd.ExecuteNonQuery();
                cmd.CommandText = "insert into table2 values(2,2)";
                cmd.ExecuteNonQuery();
                //提交事务
                tx.Commit();
            }
            catch (Exception ex)
            {
                //回滚事务
                tx.Rollback();
                MessageBox.Show(ex.Message);
            }
            finally
            {   //如果连接状态为打开则关闭连接
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }</strong></span>


        执行结果3

               同执行结果2


    事务是一个程序员肯定会用到的东西,现在只是简单的理解,大牛们多多指教。



评论 90
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值