| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1723 人关注过本帖
标题:对SqlTransaction事务有点失望
只看楼主 加入收藏
binghe6610
Rank: 2
等 级:论坛游民
帖 子:273
专家分:61
注 册:2009-2-23
结帖率:86.67%
收藏
已结贴  问题点数:0 回复次数:11 
对SqlTransaction事务有点失望
或者是我的使用不正确,为什么我的事务SqlTransaction总是出问题呢。
我的事务是用在同时删除两个表中的数据,在使用中大概也就是几个月的时间出现过两次
这样的情况,其中一个表删除多删除了一次,导致数据不一致了。
如:
表1                                表2
id       金额   关联字段           关联字段        金额
1       5000       101               101          2000
                                     101          1500
                                     101          1000
                                     101           500

表1.金额=sum(表2.金额)

现在表2 insert into数据时同时累计加到表1.金额字段我用的事务没有出现过问题,
同样我在删除表2.金额时也使用事务减少表1.金额字段的值。
但是有时就发现表1.金额的数据会出现负数,也就是多减少了一次

我是这样用事务的:
       Dim shiwu As SqlTransaction
        Dim cn As New SqlConnection(cnchuan)
        Dim cmd As New SqlCommand
        cmd.Connection = cn

        If cn.State = ConnectionState.Closed Then
            cn.Open()
        End If
        shiwu = cn.BeginTransaction '初始化事务对象
        cmd.Transaction = shiwu

        Try
             = "delete from "
            cmd.ExecuteNonQuery()
             = "delete from"
            cmd.ExecuteNonQuery()

            () '提交数据库事务
            Return True
        Catch ex As Exception
            shiwu.Rollback() '事务回滚
            Return False
        Finally
            cn.Close()
        End Try

请高手赐教!

搜索更多相关主题的帖子: 数据 
2011-07-02 15:37
不说也罢
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:39
帖 子:1481
专家分:4989
注 册:2007-10-7
收藏
得分:20 
楼主所问的问题与SqlTransaction事务本身无关的。如果是一个人的话就被你冤枉了。你代码中的事务提交与回滚用法都是正确的。
像你提出来的这个问题现象,我觉得与你的数据库有关系才对。
你的贴子中虽然能看出来表一与表二通过外键关联,但并没有写清楚表的主从(也叫主表与子表)关系。
你将两个表并设置为级联删除了吗?也就是说删除主表数据时,系统自动删除相应的从表数据。
另外,你也可以在主表上建立触发器。删除主表数据前将从表中的关联数据先删除(如果存在的话)


===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2011-07-02 16:04
binghe6610
Rank: 2
等 级:论坛游民
帖 子:273
专家分:61
注 册:2009-2-23
收藏
得分:0 
首先感谢”不说也罢“的回复

我的表1和表2之间已经有一个update触发器了,但是是更新相关字段的内容。
我的update触发器建在了表1上,
但是我的删除操作是删除表2中一条记录(如表2.金额为500元),
同时减少表1.金额500元:表1.金额=表1.金额-500

您的意思是,我可以在表1上的update触发器上添加上一条删除的语句?
2011-07-02 16:48
binghe6610
Rank: 2
等 级:论坛游民
帖 子:273
专家分:61
注 册:2009-2-23
收藏
得分:0 
我的几个问题都是”不说也罢“给解决的,非常感谢,如果方便的话可否通过其他方式与您沟通学习

[ 本帖最后由 binghe6610 于 2011-7-2 17:49 编辑 ]
2011-07-02 16:51
binghe6610
Rank: 2
等 级:论坛游民
帖 子:273
专家分:61
注 册:2009-2-23
收藏
得分:0 
这个还有点麻烦,这两个表关联的地方还不少。
用触发器好像也不怎么妥当,表2(从表)删除一条记录同时表1(主表)关联字段数据减少金额,不知道触发器能否做到。

这两个表是我的程序的两个核心业务的表,数据量还很大
2011-07-02 17:20
不说也罢
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:39
帖 子:1481
专家分:4989
注 册:2007-10-7
收藏
得分:0 
回复 3楼 binghe6610
触发器一般就是用在数据库中发生INSERT、 DELETE、UPDATE时所用啊。当然可以在触发器中建立条件判断。当条件满足时,触发器会执行相应的事务。


===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2011-07-02 17:21
binghe6610
Rank: 2
等 级:论坛游民
帖 子:273
专家分:61
注 册:2009-2-23
收藏
得分:0 
其实两个表之间有这样一个关系:
表1.金额=sum(表2.金额)

表1.金额的数据都是通过表2.金额的变动(增加或减少)更新而来的
2011-07-02 17:25
binghe6610
Rank: 2
等 级:论坛游民
帖 子:273
专家分:61
注 册:2009-2-23
收藏
得分:0 
两个表我并没有建立主从关系
2011-07-02 17:26
不说也罢
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:39
帖 子:1481
专家分:4989
注 册:2007-10-7
收藏
得分:0 
回复 5楼 binghe6610
触发器用不好,也可以在存储过程里写入相应的代码,在对某一个表DELETE/UPDATE/INSERT的之前或之后,对另外一个表或多个表进行操作。C/S OR B/S程序中用存储过程比直接写SQL语句要好。将对数据库的所有操作交由服务器执行,而你要做的,只是由CLIENT端提交服务器端的存储过程所需要的参数。既安全又高效。如果你在存储过程和触发器这一块的功课没有做足的话,建议你补修一下。
关于数据库的问题,我想还是发到对应的版块比较好。与.NET无关了。

===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2011-07-02 17:28
不说也罢
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:39
帖 子:1481
专家分:4989
注 册:2007-10-7
收藏
得分:0 
这里有个创建关系的例子。打开你的SERVER中对应的表,在树目录的第一个就是“关系图”
图片附件: 游客没有浏览图片的权限,请 登录注册



===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2011-07-02 17:33
快速回复:对SqlTransaction事务有点失望
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.084766 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved