以前只是在数据库中使用了事务,但是并没有在代码中使用过事务,最近解决问题时正好有了这个需求,这会不能再放过它了。由于是初次使用首先进行了各种尝试,下面写我尝试过程中的一点点收获。
SQL事务我们都很熟悉,这里不再赘述。
EnterpriseServices比较不常见,我们也不再过多叙述。
我把重点放到了ADO.NET实现事务和TransactionScope实现事务上。
调用Connection和Transaction对象来控制事务,首先调用Connection对象的Begin Transaction方法来标记事务的开始,然后将Transaction对象分配给要执行的Command的Transaction属性,最后执行所需命令(Transaction的Commit方法用来提交事务,Rollback方法用来取消事务)
在.NET 2.0中新添加了system.Transaction的命名空间,他提供了一个易于使用的操作事务的框架。它实现了自动提升事务机制PromoTransaction,会自动根据事务中涉及的对象资源判断使用何种事务管理器。TransactionScope事务类可以使代码成为事务性代码。
建立数据库“shiyan”,数据库中有两张表Table1和Table2,每个表中都有两个字段id和name,其中table1中无主键,Table2中id作为主键。每次执行时我们的目的都是同时向两个表插入数据。
无事务代码
<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
<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>
同执行结果2
事务是一个程序员肯定会用到的东西,现在只是简单的理解,大牛们多多指教。