日期:2014-05-16  浏览次数:20542 次

在事务中 批量修改表A 怎么不影响其他人访问和修改表A
1.有一张Custom表,数据500W以上
2. 分配的时候,执行事务 在事务中大约有6条update、insert语句
3.现在是这种情况, 当一个用户进行分配操作,大约30秒,其他人就用不了系统了(因为主要的页面都是跟Custom表有联系的)

如何在执行事务期间,不影响其他用户做有关Custom表的操作?(查询、单条修改、单条新增),请回答详细的设计方案或解决方案,万分感谢!

------解决方案--------------------
引用:
Quote: 引用:

UPDATE的锁是避免不了的,可以考虑在SELECT语句上加WITH(NOLOCK)

nolock不行 我正在操作的数据就查出来了,而且还是事务没执行完前的数据(即脏读)

我在网上查了下 剔除已经被锁定行的数据------with(READPAST)
不知道这样可以不


这个适用于快照隔离 估计不行吧 你试试
------解决方案--------------------
你的问题本身就是一个矛盾

执行事务 在事务中大约有6条update、insert语句

如何在执行事务期间,不影响其他用户做有关Custom表的操作?(查询、单条修改、单条新增)
事务的特征之一就是隔离性

隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

你不等第一个事务执行完,就行让第二个事务执行,这不是毛段吗

另外你说的READPAST,这是一种“锁机制”,对于你的情况,完全不适合

READPAST就是说,
当前session发现要独占的某个资源上已经被其他session加了排它锁,
当前session会跳过这条数据,寻找满足条件的下一个数据

ok,你第二个事务要更新100条数据,执行时候发现有50条给被一个事务占用着,另外50条没有被第一个事务占用,他会跳过被其他事物独占的50条数据,去更新没有被独占的50条数据,那不是还没有达到目的吗,甚至会发生严重的错误

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

UPDATE的锁是避免不了的,可以考虑在SELECT语句上加WITH(NOLOCK)

nolock不行 我正在操作的数据就查出来了,而且还是事务没执行完前的数据(即脏读)

我在网上查了下 剔除已经被锁定行的数据------with(READPAST)
不知道这样可以不


这个适用于快照隔离 估计不行吧 你试试

关于readpast锁提示,这里解释的非常好,建议看一下
http://www.windbi.com/showtopic-120254.aspx