Foxtable(狐表)用户栏目专家坐堂 → 事务处理不一致的问题


  共有3248人关注过本帖树形打印复制链接

主题:事务处理不一致的问题

帅哥哟,离线,有人找我吗?
zpx_2012
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
事务处理不一致的问题  发帖心情 Post By:2014/11/18 18:11:00 [显示全部帖子]

订单表在新增一行时。
在beforesavedatarow代码中用下面的代码在新增行保存时记录到日志表中
If e.DataRow.RowState = DataRowState.Added Then
   xgfs = "新增"
   str = "Insert Into Log (修改时间,操作者,部门,修改方式,表名,单据编号,识别号,辅助识别号,行号) Values('" & Date.Now() & "','" & MyName & "','" & MyGroup & "','" & xgfs & "','" & tb & "','" & e.DataRow(Idc) & "','" & e.DataRow(Idc1) & "','" & e.DataRow(Idc2) & "'," & e.DataRow("_Identify") & ")"
SQLLIST.Add(str)
end if

是通过调用下面的事务函数来统一执行的,
Dim SqlList As List(of String) = Args(0)
Try
    Connections(Mydata).BeginTransaction() '开始事务
    Dim cmd As new SQLCommand
    cmd.ConnectionName = Mydata
    For Each sql As String In SqlList
        cmd.CommandText = sql
        cmd.ExecuteNonQuery()
    Next
    Connections(Mydata).Commit()  '提交事务
    sqlList.Clear()  '清空集合
    Return "OK"
Catch ex As Exception
    Connections(Mydata).Rollback()  '回滚事务
    msgbox(ex.tostring)      '返回错误信息
    sqlList.Clear()  '清空集合
    Return "NG"
End Try

问题是:Log记录表中却记录了这条新增的记录,但记录"_Identify"的行号列的值却0;而在后台数据据订单表中查不到这条记录,按上面的事物应该如果新增订单表不成功,那Log中的记录也会回滚也没有才对,为什么会这样,并且“_Identify”为什么会有等于0的情况?

谢谢!


 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/11/18 19:18:00 [显示全部帖子]

每个月偶尔会出现一两次这样的情况,所以做的例子也很难重现,
那"_Identify"的值什么情况下会为0呢?

 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/11/18 20:02:00 [显示全部帖子]

请教逛逛版主,这个事务用法哪里不妥呢?行保存时的所有相关更新其他表单数据的SQL语句是在表的beforesavedatarow事件中添加到sqllist集合中的,而日志Log是统一在全局事件beforesavedatarow代码中再加到sqllist集合中的,而在全局事件代码的最后一行才用
If Functions.Execute("tp_SQL",SQLLIST) = "NG" Then
    e.cancel = True
End If
来统一执行所有的事务,这样不对吗?
因为偶尔会有些单据行莫明其妙的丢失掉,这个问题困扰很久但一直找不到原因,请帮忙指点一下。谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/11/18 20:10:00 [显示全部帖子]

甜老师,但合成的语句中都没有这些特殊字符啊

 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/11/18 20:26:00 [显示全部帖子]

_Identify是在保存后才生成,那下面这个代码将_Identify赋值给行号,会是保存前的还是保存后的_Identify呢?
Insert Into Log (修改时间,操作者,部门,修改方式,表名,单据编号,识别号,辅助识别号,行号) Values('" & Date.Now() & "','" & MyName & "','" & MyGroup & "','" & xgfs & "','" & tb & "','" & e.DataRow(Idc) & "','" & e.DataRow(Idc1) & "','" & e.DataRow(Idc2) & "'," & e.DataRow("_Identify") & ")

 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/11/18 20:40:00 [显示全部帖子]

那要记录真正保存过后的_Identify要在哪个事件,怎么写代码才能记录?

 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/11/18 20:51:00 [显示全部帖子]

那样不现实啊,因为很多时候增加行是有些字段要设置必填的,没有必填就不能保存的。

 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/11/18 21:41:00 [显示全部帖子]

我现在的做法是在保存一张表单比如采购入库单前,将跨表更新其他表数据的sql语句加入到事务中统一执行(例如:更新采购单中的累计入库数量,更新库存表中的库存数量等,所以只能一行一行的保存)事务的作用就是这些相关的更新全部成功执行时才保存采购单,有个最大的疑问是如果这些事务都成功执行了,会不会出现本采购单保存不成功的情况,这样就会不一致了。
但我不知道怎么样才能将本采购单的保存动作也加入到前面说到的这个事务中一起执行(难道也用一个Update语句来更新本采购单中变动的行?),所以只好选择系统默认的保存了。不知这个要怎么克服才好?

 回到顶部
帅哥哟,离线,有人找我吗?
zpx_2012
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:976 积分:8527 威望:0 精华:0 注册:2012/2/9 16:35:00
  发帖心情 Post By:2014/11/18 21:56:00 [显示全部帖子]

想再问下,两个问题
1、保存前到底是什么含义,即本单要Update到数据库之前,如果系统的beforesavedatarow的代码都成功执行了,就开始执行保存的动作,但保存是否成功怎么知道啊,平时都是按系统那个默认的保存按钮,如果没有成功会有什么反应,怎么才知道?(是不是行号那个颜色没有就表示返回了成功保存的信号)
2、如果要自己编写SQL语句,用UPdate语句保存那且不是还必须遍历每一行的每一列出来才行,这样太繁琐了吧!


 回到顶部