日期:2014-05-18  浏览次数:20873 次

请问,ADO.NET操作数据库,事务
下面的例子来自MSDN


static void Main(string[] args)
  {
  string str = "server = '(local)';database=Person;integrated security = true";  
  using (SqlConnection con = new SqlConnection(str))  
  {
  con.Open();
  using (SqlCommand com = con.CreateCommand()) 
  {
  SqlTransaction transaction = con.BeginTransaction(); //启动事务
  com.Transaction = transaction;
  try
  {
  com.CommandText = "INSERT INTO 客户表 VALUES('552021','张岚','false','26','荷兰')";
  com.ExecuteNonQuery();
  com.CommandText = "INSERT INTO 客户表 VALUES('410236','小英','false','26','北京')";  
  com.ExecuteNonQuery();
  transaction.Commit(); //提交事务
  Console.WriteLine("插入成功");
  }
  catch
  {
  try
  {
  transaction.Rollback();
  Console.WriteLine("没插入成功");
  }
  catch { };  
  }
  }
  }
  Console.ReadKey();
  }


上面的代码,执行的时候,如果T-SQL语句没有错,会插入成功。如果T-SQL语句有错,则会产生异常,执行catch部分,执行回滚。

我想问的是Rollback方法,上面代码就算是没有Rollback方法,catch里面是空的,照样不会插入成功,也就相当于回滚了吧,那这个Rollback方法岂不是多此一举吗?
什么时候能用上Rollback方法呢?请举个简单的例子...

------解决方案--------------------
你说的那不是一个意思 首先你得了解事务的意思 
比如一直用来举例的事务例子(银行转账事例).
------解决方案--------------------
com.CommandText = "INSERT INTO 客户表 VALUES('552021','张岚','false','26','荷兰')";
com.ExecuteNonQuery();
com.CommandText = "INSERT INTO 客户表 VALUES('410236','小英','false','26','北京')";
com.ExecuteNonQuery();
这两条数据需要同时成功才会成功,否则会执行Rollback。
------解决方案--------------------
如果你对数据库添加监视,你会发现,无论你加不加transaction.Rollback();只要捕获到异常,事务便会回滚,并且可以在监视栏中看到事务回滚的执行事件

你还有一个误区,虽然异常了,并不会显示在数据库中,那是因为默认情况下,已经回滚了,即便你没有显示的调用transaction.Rollback();

比如说,你的第一条插入语句正常执行,第二条语句插入有语法错误,那么第一条肯定能正常的插入到数据库【这一点可以通过自增ID的变化来得到证实】,只不过呢,因为回滚的原因,把所有的包括插入成功的也一并删除了,也就是你所看到的假象,未能插入到数据库
------解决方案--------------------
不是很确定,没找到这部分资料。可能BeginTransaction开始到Commit前执行的命令序列需要占用一部分数据库资源,如果Commit之前出错则未提交事务,虽都不插入但占用的那部分数据库资源没有被清理释放,所以要执行RollBack。如果不执行RollBack,时间长了数据库资源可能会耗尽不能用。

不过纯属猜测。


------解决方案--------------------
没有人知道吗?
------解决方案--------------------
在你插入数据的时候 插入很多条数据的时候哈....你前面5条数据插入成功了,,但是第6条数据插入出错了?改怎么办????把这5条数据插进去??还是怎么的???
事务的作用就在于,对数据库的安全负责..就像上面说的,只插入了5条数据..后面NN 没插入... 加入系统这样的处理::把这5条数据插入,而不管后面的了. 但是你很定要把后面的也要插入 对吧??但是数据源还是 一个 ,所以前面的5条数据会反复的插入..所以这个很定是不行的..
事务的作用就是 在 事务开始到结束期间,插入数据的时候 只要有 任何数据插入出错,都会自动把数据还原的事务开始之前.这个就叫事务的RollBack .只有在全部成功插入之后,才会 commit()
------解决方案--------------------
你对数据库监视一下就什么都清楚了,与其说什么时候利用回滚,倒不如说什么情况下利用事物.
------解决方案--------------------
用:事件探察器(SQL Profiler) 

开始--程序-- SQLSERVER