起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 349|回复: 15

【结帖】[问题]事务长时间占用的问题?**

[复制链接]
发表于 2007-12-8 16:11:40 | 显示全部楼层 |阅读模式
在一个事务中做如下的动作:
1.保存一笔入库单的修改
2.根据这笔入库单更新库存

在事务没有结束的情况下,另外的用户查询入库单,经测试,这个用户只能等这个事务结束。

如果该事务较长,查询的用户就会长时间的等,在界面上,就是系统没有反应。怎么解决,更新库存的动作,不影响其他用户的查询呢?
回复

使用道具 举报

发表于 2007-12-9 13:14:32 | 显示全部楼层
楼主是否使用了立即事务?
回复 支持 反对

使用道具 举报

发表于 2007-12-9 13:16:50 | 显示全部楼层
另外,请尝试使用行级锁。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-9 15:05:05 | 显示全部楼层
看下面的代码,没有使用立即事务。UpdateBalance是更新库存表,其中调用了存储过程。

with MasterDataSet.Connection.Transaction do begin
    try
      FTransaction:=Start(False);
      MasterDataSet.ApplyUpdates(True);
      if FSyncBalance then UpdateBalance('Audit');//设置UpdateBalance执行一分钟
      Commit(FTransaction);
    except
       ......
      end;
    end;
  end;

我试着在masterDataSet中的SQL定义中控制锁,即在from 字句中加入 WITH (READPAST),但运行时提示SQL错误。

我该如何在数据集的Select语句中加入 With (ReadPast)呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-9 16:53:14 | 显示全部楼层
最初由 zhengjy 发布
[B]另外,请尝试使用行级锁。 [/B]


我试着这样加了行级锁,但查询事务依旧等待。

111.jpg

58.85 KB, 下载次数: 163

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-9 16:59:14 | 显示全部楼层
如果我手工修改了数据集的Select语句,则运行时出错:

给查询语句SELECT COMMONMASTER.ID, COMMONMASTER.SYSTEMNAME,
.....
  FROM COMMONMASTER with (readpast)
  WHERE COMMONMASTER.SYSTEMNAME = 'StoreManage' and COMMONMASTER.TABLENAME = 'StuffStoreOut'
加条件(BillTypeCode='015' and opState='10')的时候出现异常:
不支持的查询语句:SELECT COMMONMASTER.ID
.....
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-10 11:57:06 | 显示全部楼层
项!
回复 支持 反对

使用道具 举报

发表于 2007-12-10 13:30:04 | 显示全部楼层
抱歉,没有看清1楼的描述。

在更新某条记录时,再去查询该记录,使用行级锁也解决不了你的问题。

目前只能尽量缩短更新的时间了。
回复 支持 反对

使用道具 举报

发表于 2007-12-10 13:31:33 | 显示全部楼层
另外,楼主可以查询一下数据库的帮助。

看看对记录的锁定方式中,有没有在更新同时允许查询的
回复 支持 反对

使用道具 举报

发表于 2007-12-10 13:38:20 | 显示全部楼层
锁定提示
可以使用 SELECT、INSERT、UPDATE 和 DELETE 语句指定表级锁定提示的范围,以引导 Microsoft® SQL Server™ 2000 使用所需的锁类型。当需要对对象所获得锁类型进行更精细控制时,可以使用表级锁定提示。这些锁定提示取代了会话的当前事务隔离级别。



说明  SQL Server 查询优化器自动作出正确的决定。建议仅在必要时才使用表级锁定提示更改默认的锁定行为。禁止锁定级别反过来会影响并发。


锁定提示 描述
HOLDLOCK 将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK 等同于 SERIALIZABLE。
NOLOCK 不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于 SELECT 语句。
PAGLOCK 在通常使用单个表锁的地方采用页锁。
READCOMMITTED 用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。
READPAST 跳过锁定行。此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。READPAST 锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于 SELECT 语句。
READUNCOMMITTED 等同于 NOLOCK。
REPEATABLEREAD 用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。  
ROWLOCK 使用行级锁,而不使用粒度更粗的页级锁和表级锁。
SERIALIZABLE 用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。
TABLOCK 使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,SQL Server 一直持有该锁。但是,如果同时指定 HOLDLOCK,那么在事务结束之前,锁将被一直持有。
TABLOCKX 使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。
UPDLOCK 读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。
XLOCK 使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用 PAGLOCK 或 TABLOCK 指定该锁,这种情况下排它锁适用于适当级别的粒度。
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-5 00:26 , Processed in 0.044171 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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