| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3947 人关注过本帖
标题:关于远程访问数据,如何完善事物管理
只看楼主 加入收藏
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:651
专家分:20
注 册:2014-1-16
收藏
得分:0 
厨师王德榜师傅提到的TRY的用法有些复杂,一时半会弄不懂,mywisdom88说的存储过程我也不会用,我在网上查了一些资料,用如下的方法,师傅们看行不行:
CSQL="INSERT...."+CHR()
CSQL=csql+"UPDATE...."     &&把2个操作集中到一个字符串
SQLSETPROP(gnHandle, 'Transactions', 2)
myreturn=sqlexec(gnHandle,csql)
if myreturn=1
   sqlcommit(gnHandle)    &&事务交付
else
   sqlrollback(gnHandle)  &&事务回滚
endif  
SQLSETPROP(gnHandle, 'Transactions', 1) &&事务改回自动处理


[此贴子已经被作者于2019-8-20 17:21编辑过]

2019-08-20 16:58
radiofan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:466
专家分:696
注 册:2006-7-30
收藏
得分:0 
回复 12楼 fanjinyu9108
程序代码:
If Not SQLExec(connhandle,"set lock_timeout 1000") = 1  &&设置超时时间
    Messagebox("错误提示")
    RETURN
ENDIF

If Not SQLExec(connhandle,"Begin Transaction") = 1 &&开始事务
    Messagebox("不能开始事务")
    RETURN
ENDIF

sqlok = SQLExec(connhandle,"delete ……")

If sqlok < 0
    If Aerror(laErr)>0
        cErrorText = ALLTRIM(SUBSTR(Transform(laErr(1,3)),RAT("]",Transform(laErr(1,3)),1)+1,200))
        cErrorHeader = ALLTRIM(Transform(laErr(1,1)))
    ENDIF
    SQLExec(connhandle,"Rollback Transaction")  &&回滚事物
    MESSAGEBOX(cErrorText,0+16,"错误:"+cErrorHeader)
    Return
ENDIF

sqlok = SQLExec(connhandle,"update ……")

If sqlok < 0
    If Aerror(laErr)>0
        cErrorText = ALLTRIM(SUBSTR(Transform(laErr(1,3)),RAT("]",Transform(laErr(1,3)),1)+1,200))
        cErrorHeader = ALLTRIM(Transform(laErr(1,1)))
    ENDIF
    SQLExec(connhandle,"Rollback Transaction")  &&回滚事物
    MESSAGEBOX(cErrorText,0+16,"错误:"+cErrorHeader)
    Return
ENDIF

sqlok = SQLExec(connhandle,"insert ……")

If sqlok < 0
    If Aerror(laErr)>0
        cErrorText = ALLTRIM(SUBSTR(Transform(laErr(1,3)),RAT("]",Transform(laErr(1,3)),1)+1,200))
        cErrorHeader = ALLTRIM(Transform(laErr(1,1)))
    ENDIF
    SQLExec(connhandle,"Rollback Transaction")  &&回滚事物
    MESSAGEBOX(cErrorText,0+16,"错误:"+cErrorHeader)
    Return
ENDIF

If Not SQLExec(connhandle,"Commit Transaction") = 1 &&完成事务
    SQLExec(connhandle,"Rollback Transaction")  &&回滚事物
    Messagebox("未能完成事务")
    Return
ENDIF
2019-08-21 11:04
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:651
专家分:20
注 册:2014-1-16
收藏
得分:0 
非常感谢radiofan师傅的解答,程序我还有点看不懂,需要慢慢消化,有几个疑问如下:
一 SQLExec(connhandle,"Begin Transaction") 这一句是不是调用SQL本身的事务代码,调用这个语句,不需要设置SQLSETPROP(gnHandle, 'Transactions', 2)之类的语句吗
二 如果sqlok = SQLExec(connhandle,"delete ……")成功,但是sqlok = SQLExec(connhandle,"update ……")失败了,SQLExec(connhandle,"Rollback Transaction") 是回滚2个操作,还是仅仅回滚第二个操作
三 使用SQL的事务管理是不是比VFP的事务管理优越些。





[此贴子已经被作者于2019-8-22 08:59编辑过]

2019-08-22 08:46
radiofan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:466
专家分:696
注 册:2006-7-30
收藏
得分:0 
以下是引用fanjinyu9108在2019-8-22 08:46:19的发言:

非常感谢radiofan师傅的解答,程序我还有点看不懂,需要慢慢消化,有几个疑问如下:
一 SQLExec(connhandle,"Begin Transaction") 这一句是不是调用SQL本身的事务代码,调用这个语句,不需要设置SQLSETPROP(gnHandle, 'Transactions', 2)之类的语句吗
二 如果sqlok = SQLExec(connhandle,"delete ……")成功,但是sqlok = SQLExec(connhandle,"update ……")失败了,SQLExec(connhandle,"Rollback Transaction") 是回滚2个操作,还是仅仅回滚第二个操作
三 使用SQL的事务管理是不是比VFP的事务管理优越些。


相互学习!

1、送出的是在后台执行的语句
2、只要后台事务中的一个操作不成功,就回滚事务中的所有操作!

后台操作,要考虑的事情很多,其中死锁就很麻烦!需要特别注意。


[此贴子已经被作者于2019-8-22 10:12编辑过]

2019-08-22 10:06
hlzcxkj
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2017-9-5
收藏
得分:0 
学习了
2020-01-22 17:06
快速回复:关于远程访问数据,如何完善事物管理
数据加载中...
 
   



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

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