事务的问题
程序大意如下: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多方法。 --------------------编程问答--------------------
不是操作1执行完执行操作2就可以,而是操作2如果执行不成功,是需要连同操作1一起回滚的.所以才要把1和2放在同一个事务里才行. --------------------编程问答-------------------- 事务放外面,在catch里rollback --------------------编程问答-------------------- MARK --------------------编程问答-------------------- 顶一下
顺更提个建议,,请使用存储过程,别把所有处理都交给应用程序 --------------------编程问答-------------------- 很明显那个dll不支持DTC...它本身都没有事务操作凭什么让你来实现? --------------------编程问答-------------------- 原因基本清楚了,一般情况下这种处理方式是没有问题的.问题在于调用的那个dll使用的是ado来操作数据的。不是ado.net,是ado
现在问题变成了为什么ado和现在的事务不兼容,这种情况有没有好的处理方案。
用过ado的人似乎都不多了吧。 --------------------编程问答--------------------
你的意思是不是当前方法使用ADO.NET的事务机制,而调用的DLL中数据访问使用的是ADO呢,那样的话自然是不行了。即使DLL中使用的也是ADO.NET,如果是新开的连接或者是另一个线程上,事务都是不能工作的。
如果你能对DLL进行修改就比较好办了,如果不行,只能在调用前先commit当前事务,并手工记录现状,DLL返回时手工回滚了(那样的话确实是很痛苦,但貌似是可行的)。
--------------------编程问答-------------------- 事务当中嵌套事务如何 --------------------编程问答--------------------
怎么美女变身了,被众多脸上没毛的追也不至于苦成这样呀,要变也变个大老虎之类的好些呀。xixi,不过事务嵌套的前提是一个数据库连接。 --------------------编程问答--------------------
--------------------编程问答-------------------- 一次事务应该是实现不了的,重整逻辑... --------------------编程问答-------------------- 我想想,如果可以改变DLL中代码的话,将其读取数据库相关的方式改为脏读,应该可以读到新建的记录,这样改动应该最小。 --------------------编程问答-------------------- 改成脏读也不行,我觉得是ado和目前的事务不兼容。
using (TransactionScope scope = new TransactionScope())
{ //创建事物对象
try
{
//执行事务操作的相关代码
scope.Complete(); //提交事物
}
catch (Exception ex) { throw ex; } //抛出异常
finally { scope.Dispose(); } //回滚事物
}
另外,在vb6当中可以使用.net的类库吗?比如system.data.oledb --------------------编程问答--------------------
可以不可以用这个思路: 生成一个com可见的dll(.net的类库),给VB6调用,使VB6的写入数据库操作通过该DLL处理。 --------------------编程问答--------------------
这个思路大体上是我目前所能想到的最好方式了,英雄所见略同哈:)
“生成一个com可见的dll(.net的类库)” 这里能详细说一下吗?怎么样的dll是com可见的? --------------------编程问答-------------------- 这个简单: 在VS中 项目属性-> 应用程序->程序集信息->使程序集COM可见 就行
补充:.NET技术 , C#