起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 221|回复: 4

请教事务问题**

[复制链接]
发表于 2008-3-19 10:03:05 | 显示全部楼层 |阅读模式
平台下启用事务分为立即方式和非立即方式。在论坛上查过相关的帖子,对于非立即方式感觉理解了,可是对于立即方式的概念还是有些模糊,能否详细的讲解一下呢?
还有,我现在有这么一个问题,在一个事务中,会更新一个表的字段值,然后会用到更新后的值。 比如,A表中有一个保存当前单据序号的字段SEQ,启用事务后,将其值加一(update A set SEQ=isnull(seq,0) + 1),然后再将此时的值取回来作为单据的真正编号。而在非立即方式下,由于UPdate以后结果并没有提交到数据库中,因此,此时在select时,该值仍然为update之前的值。这样,就容易造成数据主键重复。请问,这种情况该如何处理?
回复

使用道具 举报

 楼主| 发表于 2008-3-19 12:35:31 | 显示全部楼层
up一下下
回复 支持 反对

使用道具 举报

发表于 2008-3-19 13:07:01 | 显示全部楼层
立即事务与非立即事务
立即事务是在启动事务同时,数据库的事务也随之启动,直到该立即事务最后一次被提交或回滚,才结束数据库的事务;
非立即事务是启动事务后,数据库的事务并不立即启动,从该事务启动到提交前的所有操作都保存到业务服务器中,直到最后一次被提交时,才真正启动数据库的事务并执行提交操作。
一般推荐使用非立即事务,这样可以减少服务器上的等待时间,减少死锁的机会。如果需要在事务中修改表的值,而且在事务中用到刚才修改的内容,就需要用立即事务了。
使用立即事务,需要在启动事务和提交事务直接用时非常的短,一般不要超过2秒,中间肯定不应该有:
ShowMessage显示信息给客户

等待客户输入信息
在事务中尽量使访问的数据量最小,这样可以减少锁定的行数,从而减少事务之间的争夺。

2.1. 相关属性和方法
function Start(AImmediate: Boolean): TTransactionHandle;
启动事务

参数AImmediate=True为立即事务
参数AImmediate=False为非立即事务
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-19 13:20:14 | 显示全部楼层
谢谢指教。
这么说我这里的情况只有使用立即事务了,不过"使用立即事务,需要在启动事务和提交事务直接用时非常的短,一般不要超过2秒"这个要求可是有点高。
回复 支持 反对

使用道具 举报

发表于 2008-3-19 13:21:17 | 显示全部楼层
那要不你就用一些变量把这些信息记录下来。其他的没有好办法了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-8 22:55 , Processed in 0.038546 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表