在调用事务中的存储过程后,我尝试回滚事务,但数据库中的所有更改仍然处于活动状态。
代码:
using (DbContext context = new DbContext("name=data"))
{
try
{
using (DbContextTransaction transaction = context.Database.BeginTransaction())
{
var mID = _id ?
new ObjectParameter("mID", _id) :
new ObjectParameter("mID", typeof(int));
((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MY_PROCEDURE", mID,);
// some condition of with ret.Value
transaction.Rollback();
过程没有自己的事务。DB自动提交已关闭。
我使用的是.NET Framework 4.5.0版。(如果不是TransactionScope)
使用using和try块进行的更改不会更改行为。
我也尝试了isolationLevel,但没有变化。
1条答案
按热度按时间r7s23pms1#
如果存储过程
MY_PROCEDURE
在过程的末尾包含一个COMMIT
语句,那么当你尝试ROLLBACK
事务时,它将ROLLBACK
到最后一个COMMIT
,并且因为你在过程中显式地告诉它COMMIT
,那么ROLLBACK
将不会有后续的更改。如果是这种情况,您的代码按设计工作,但设计不符合您的意图;要修复它,您需要从过程中删除
COMMIT
语句,然后当您ROLLBACK
事务时,它将ROLLBACK
到事务的开始。COMMIT
;如果您的过程运行并包含SQL语句,那么您将永远不能将事务ROLLBACK
到这些语句之前。)*一般来说,你不应该在过程中使用
COMMIT
语句,因为它会阻止你在过程之外控制事务(正如你所发现的那样),并且意味着你不能在同一个事务中调用多个过程,如果后面的一个失败,你就不能选择ROLLBACK
所有的过程。COMMIT
,因为它们在事务会话之外执行,因此会话的正常事务控制不会影响它们的行为。