我有以下方法:
public void SaveReferenceUpdates(ReferenceUpdatesDataContract updates)
{
mTransaction = Connection.BeginTransaction();
try
{
// Do all the updates to get the database inline with the contract.
updates.UpdateFromContract();
// Do all the deletes to get the database inline with the contract.
updates.DeletesFromContract();
try{mTransaction.Commit();}
catch{throw;}
mTransaction = null;
}
catch (Exception e)
{
mTransaction.Rollback();
mTransaction = null;
throw;
}
}
(我已经取出了所有的日志记录语句并合并了一些方法以使其更具可读性。)
奇怪的是,有时(非常非常随机)mTransaction
在进入提交步骤时为空。 (因为这种情况是随机发生的,所以当它从连接中获取事务时,我无法看到它是否为空。)
此方法在两个地方调用。一个是用户登录我的应用程序,另一个是用户暂停一段时间(基于关闭用户输入的计时器)。
我很遗憾可能导致SqlCeTransaction
(mTransaction
)为空的原因。 (该帮助没有说明返回null
的BeginTransaction。)
答案 0 :(得分:1)
这个代码是从多个线程调用的吗?这将解释行为(线程2启动事务,就在线程1完成并将其设置为null之前)。
答案 1 :(得分:0)
可能是对的。尝试锁定(mTransaction)所有块。它可以减慢程序,但肯定是安全的。