您的位置:首页 > 职场人生

事务-程序员的必经之路

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

    事务大概可以分为四种: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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  事务 技术 应用