对于Castle框架的事务,我之前是参考别人的博客来学习的,看到里面显示的写出事务的提交和回滚。当时,立即给我的感觉是事务需要显示的提交和回滚。但是,今天我通过测试和向别人请教发现事务是可以自己提交的。对于TransactionScope中的事务,它将隐式的回滚,并不一定需要我们显示的去操作。对于提交我还是使用显示的方式。
第二点误区,就是对于事务中异常的处理。我从别人博客中拷来的代码是如下所写,同时我也很长的一段时间没有去怀疑。
using (TransactionScope tran = new TransactionScope()) //事务
{
try
{
paramCity.Create();
tran.VoteCommit(); //提交事务
return true;
}
catch (NHibernate.ADOException ex) //捕获异常
{
tran.VoteRollBack(); //回滚
}
catch (Exception e)
{
tran.VoteRollBack(); //捕获异常
}
}
后来在使用这种模式的时候,发现很多异常并不能够被捕获。后面经过自己的测试和请教,将代码修改如下:
try
{
using (TransactionScope tran = new TransactionScope()) //事务
{
paramCity.Create();
tran.VoteCommit(); //提交事务
return true;
}
}
catch (Exception e) //捕获异常
{
return false;
}
在这种模式下,并不需要进行事务的回滚,同时需要把try catch放在事务的外面,这样就可以捕获异常了。分析原因大概是因为事务中的错误得在其结束的时候才会被抛出,这个时候才能够被捕获。
如果有什么说错了的地方,请大家给予纠正。在此多谢了。