当前位置:编程学习 > C#/ASP.NET >>

事务的问题

程序大意如下:
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    1、对于数据库操作,比如添加一条记录,id为1
                    2、调用另外的一个dll,对于id为1的这条记录进行另外的操作      
                    
                    scope.Complete();
                }
                catch ()
                {
                       。。。。。。
                }
                finally
                {
                    。。。。。。                
                }
            }
现在由于事务未提交,在调用的dll中无法读到这个id为1的记录。
请问这种情况该如何处理?
调用这个dll的操作肯定是应该包含在整个大事务中的,不能分离出去。 --------------------编程问答-------------------- 这么复杂,没遇到过 --------------------编程问答-------------------- 矛盾型。。。。。。。。 --------------------编程问答-------------------- 按说只要在一个connection 实例上,就算没有提交事务应该也能看得到。

不如改成显示事务处理? --------------------编程问答-------------------- 不是一个connection,dll有自己的事务处理。并且dll是别人提供的,我这边只能调用,不能修改。 --------------------编程问答-------------------- 那从DB里查是不可能了,想办法传吧。 --------------------编程问答-------------------- 在操作1和2之间+个判断,当操作1执行完后再去搞操作2,至于怎么判断操作1完成,N多方法。 --------------------编程问答--------------------
引用 6 楼 huahua2000 的回复:
在操作1和2之间+个判断,当操作1执行完后再去搞操作2,至于怎么判断操作1完成,N多方法。


不是操作1执行完执行操作2就可以,而是操作2如果执行不成功,是需要连同操作1一起回滚的.所以才要把1和2放在同一个事务里才行. --------------------编程问答-------------------- 事务放外面,在catch里rollback --------------------编程问答-------------------- MARK --------------------编程问答-------------------- 顶一下
顺更提个建议,,请使用存储过程,别把所有处理都交给应用程序 --------------------编程问答-------------------- 很明显那个dll不支持DTC...它本身都没有事务操作凭什么让你来实现? --------------------编程问答-------------------- 原因基本清楚了,一般情况下这种处理方式是没有问题的.问题在于调用的那个dll使用的是ado来操作数据的。不是ado.net,是ado

现在问题变成了为什么ado和现在的事务不兼容,这种情况有没有好的处理方案。


用过ado的人似乎都不多了吧。 --------------------编程问答--------------------
引用 12 楼 tyro 的回复:
原因基本清楚了,一般情况下这种处理方式是没有问题的.问题在于调用的那个dll使用的是ado来操作数据的。不是ado.net,是ado

现在问题变成了为什么ado和现在的事务不兼容,这种情况有没有好的处理方案。


用过ado的人似乎都不多了吧。


你的意思是不是当前方法使用ADO.NET的事务机制,而调用的DLL中数据访问使用的是ADO呢,那样的话自然是不行了。即使DLL中使用的也是ADO.NET,如果是新开的连接或者是另一个线程上,事务都是不能工作的。
如果你能对DLL进行修改就比较好办了,如果不行,只能在调用前先commit当前事务,并手工记录现状,DLL返回时手工回滚了(那样的话确实是很痛苦,但貌似是可行的)。
--------------------编程问答-------------------- 事务当中嵌套事务如何 --------------------编程问答--------------------
引用 14 楼 kingdom_0 的回复:
事务当中嵌套事务如何

怎么美女变身了,被众多脸上没毛的追也不至于苦成这样呀,要变也变个大老虎之类的好些呀。xixi,不过事务嵌套的前提是一个数据库连接。 --------------------编程问答--------------------


using (TransactionScope scope = new TransactionScope())  
{   //创建事物对象  
    try  
    {  
        //执行事务操作的相关代码  
   
   
        scope.Complete();  //提交事物  
    }  
    catch (Exception ex) { throw ex; } //抛出异常  
    finally { scope.Dispose(); }  //回滚事物  
}  
--------------------编程问答-------------------- 一次事务应该是实现不了的,重整逻辑... --------------------编程问答-------------------- 我想想,如果可以改变DLL中代码的话,将其读取数据库相关的方式改为脏读,应该可以读到新建的记录,这样改动应该最小。 --------------------编程问答-------------------- 改成脏读也不行,我觉得是ado和目前的事务不兼容。

另外,在vb6当中可以使用.net的类库吗?比如system.data.oledb --------------------编程问答--------------------
引用 19 楼 tyro 的回复:
改成脏读也不行,我觉得是ado和目前的事务不兼容。

另外,在vb6当中可以使用.net的类库吗?比如system.data.oledb

可以不可以用这个思路: 生成一个com可见的dll(.net的类库),给VB6调用,使VB6的写入数据库操作通过该DLL处理。 --------------------编程问答--------------------
引用 20 楼 etudiant6666 的回复:
可以不可以用这个思路: 生成一个com可见的dll(.net的类库),给VB6调用,使VB6的写入数据库操作通过该DLL处理。


这个思路大体上是我目前所能想到的最好方式了,英雄所见略同哈:)

“生成一个com可见的dll(.net的类库)” 这里能详细说一下吗?怎么样的dll是com可见的? --------------------编程问答-------------------- 这个简单: 在VS中 项目属性-> 应用程序->程序集信息->使程序集COM可见 就行
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,