以前只是在数据库中使用了事务,但是并没有在代码中使用过事务,最近解决问题时正好有了这个需求,这会不能再放过它了。由于是初次使用首先进行了各种尝试,下面写我尝试过程中的一点点收获。
事务大概可以分为四种: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>
同执行结果2
事务是一个程序员肯定会用到的东西,现在只是简单的理解,大牛们多多指教。