请问,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