日期:2014-05-17  浏览次数:20660 次

纠结,数据库回滚机制,中间要用查询,报异常
用户点一下"插入",要向几个表里分别插入数据,所以需要rollback机制。

大致想法是这样的
try{
 transaction = connection.BeginTransaction();
向A表插入数据
向B表插入数据
……
transaction.Commit();
}
catch{
rollback
}

现在的问题来了
在向A表插入数据的时候,生成了一个ID,我要把这个ID作为参数,在B表里插入,
try{
 transaction = connection.BeginTransaction();
向A表插入数据
查询A表刚刚插入ID,用的是select SCOPE_IDENTITY(),这里报异常了
向B表插入数据
……
transaction.Commit();
}
catch{
rollback
}

异常信息是
如果分配给命令的连接位于本地挂起事务中,ExecuteReader 要求命令拥有事务。命令的 Transaction 属性尚未初始化。


上网查了这个异常产生的原因是,在事务机制中,向A表插入数据,并没有真正的向A表插入呢,所以在这里查询,就是在查询脏数据,所以报异常

------解决方案--------------------
请注意下:你这是一个事务而要进行两个大事件A和B,在A执行完后要COMMIT一下,否则A事件并没有真正执行。
------解决方案--------------------
查询的时候也加事务就OK了