情形1:SqlConnection conn = new SqlConnection(ConfigContext.GetDBConnectString);
SqlTransaction tran;using (conn)
{
conn.Open(); using (tran = conn.BeginTransaction())
{
try
{
//do sthing
tran.Commit();
}
catch
{
tran.Rollback();
}
}
}
情形2:
SqlConnection conn = new SqlConnection(ConfigContext.GetDBConnectString);
SqlTransaction tran;try
{
using (conn)
{
conn.Open(); using (tran = conn.BeginTransaction())
{ //do sthing
tran.Commit(); }
}
}
catch
{
return false;
}
对于第一种,我想有很多缺点,1.conn.open这步没有加try catch,这样open可能失败而不被捕捉
2.try catch的目的仅仅是为了能手动rollback对于第二种我比较中意,但是我有几点担心,1.如果try块内出现异常,整个事务能不能rollback?或者至少跟rollback了一样
我想了想,如果我在commit之前使用了同一个tran的好几个sql命令,那么如果其中任意个出现异常,都会导致代码运行不到
commit,但是如果在commit的过程中出现了异常,比如,往前两个表里添加了数据,到第三个表的时候出现异常,那么此时
在大的catch里是无法捕捉到tran的,因为它的生命周期问题,那么此时的tran是整个都不会提交?还是提交了一部分,只要
你不手动rollback它就不会自己rollback,如果这样的话,我得必须采用1了,大家有什么好的建议??
你也可以多个try欠 套
把俩结合起来啊 SqlConnection conn = new SqlConnection(ConfigContext.GetDBConnectString);
SqlTransaction tran;try
{
using (conn)
{
conn.Open(); using (tran = conn.BeginTransaction())
{ try
{
//do sthing
tran.Commit();
}
catch
{
tran.Rollback();
}
{}
}
}
catch
{
return false;
}
虽说tran的生命周期在using里,但如果出现异常的话,,,,,,so,那个大的catch能否访问到tran
大的catch 不能访问到tran
using完之后就出作用域了
try
{
using(conn)
{
conn.open();
using(tran = conn.beginTranfaction())
{
....
}
}
}
catch
{
if( tran != null)
tran.rollback();
}