分区视图和锁

wenzm 2003-08-21 03:29:54
1、用一UPDATE更新记录(保证一次只更新到一条),如何保证UPDATE只建立 行锁而不会表级锁?
2、有一业务需要往某表插入记录,此表T1的增长速度大概为10000条/天,则一年后此表的容量为10000*360=360万条……
如此下去系统肯定会让用户难与忍受……做设计时候该如何处理? SQLSERVER中有分区试图的功能,能不能借助分区视图技术,
每个月份建立一张数据表来存放数据,而通过分区试图技术,对外做查询统计时候所有按月份建立出来的表表现为一张表?怎么实现?
...全文
46 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_rose 2003-08-24
  • 打赏
  • 举报
回复
对于索引来说,360万条记录与3千6百条记录之间没有太大的分别。如果从3600条记录中找到一条记录需要足足1秒钟,那么从3600000条记录中找到一条就需要大概2、3秒。

当然,除非你没有善用“索引”。
wenzm 2003-08-22
  • 打赏
  • 举报
回复
对“抢购问题” , 大家看这样行不行

当取出每个POS申请抢购数量的时候不做数量的判断,即为出库而非销售。而后中间层程序控制每隔一段时间,提交一次对抢购商品表的检索与更新。比如在一个时间段内,有5个POS提交了对对应商品的抢购需求,我对5个POS终端的同一商品的数量进行累加,而后一次性的到数据表中进行数量的判断,如果请求量小于剩余库存则交易成功(一起提交5个POS端的请求),如过总数量超过了总的库存,则回滚这5个所有的请求,当然复杂点的比如可以按从请求数量的从大到小来单个取消这5个中的某一个或多个请求(按实际的抢购申请量和库存量)……
这样可以大大的减低对同一数据表同一行数据的并发请求而导致队列的串行时间消耗……
当然这样做起来肯定会比较麻烦,特别是时间间隔的控制和对多个用户进行一个事物的封装 ,但我想应该可以实现
大家讨论一下,可行不可行!?
pengdali 2003-08-21
  • 打赏
  • 举报
回复
1、如果用分区视图,当INSERT或者UPDATE或者DELETE时候,可以在视图上操作也可以在相对应的“原子”表上操作(假如我操作的时候知道具体对哪个表进行操作),从效率上来说,哪个会快些!?
这个效率没有什么可比性,肯定是知道具体对哪个表快,但可以忽略


2、 另外,对单行记录锁定更新,有没有更好的方法呢? 比如我的业务如下:
1 如何锁一个表的某一行


A 连接中执行

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

begin tran

select * from tablename with (rowlock) where id=3

waitfor delay '00:00:05'

commit tran

B连接中如果执行

update tablename set colname='10' where id=3 --则要等待5秒

update tablename set colname='10' where id<>3 --可立即执行

2 锁定数据库的一个表

SELECT * FROM table WITH (HOLDLOCK)


注意: 锁定数据库的一个表的区别

SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除

SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除
wenzm 2003-08-21
  • 打赏
  • 举报
回复
1、如果用分区视图,当INSERT或者UPDATE或者DELETE时候,可以在视图上操作也可以在相对应的“原子”表上操作(假如我操作的时候知道具体对哪个表进行操作),从效率上来说,哪个会快些!?

2、 另外,对单行记录锁定更新,有没有更好的方法呢? 比如我的业务如下:

我定义有一批紧俏商品,每类商品规定了限量,对应表如下

T_LimitWare (WareCode,LimitNum)
数据如: 001 20
002 100
……
当抢购商品的时候,系统首先从次表中按商品编码(WareCode)来检测仓库中还存在的数量(LimitNum),当购买量小于对应商品的 LimitNum时候,交易成功(此时应该更改LimitNum的值),否则失败。当此类紧俏商品销售完后,则对应商品记录从此表中删除!

因为业务实际情况,抢购总是发生在每一天的特定时候,而且客户抢购商品的先后顺序也类似(比如首先看001还有没有库存,如果没有则查看002……),也就是说对此表中同一条记录的并发访问情况在抢购时候非常普遍,而且因为终端很多(50个以上),造成此时候系统的访问速度非常的慢

对以上描述的问题,如果单单靠数据库的锁来解决并发以保证数据上的正确,而因为锁而又导致系统此时的串行运行……系统运行速度让操作员也让客户无法接受,请教有没有好的是方法或者设计,来解决此问题……
恭候!


CrazyFor 2003-08-21
  • 打赏
  • 举报
回复
2,每月数据建一个表
littlestoneyi 2003-08-21
  • 打赏
  • 举报
回复
1 指定锁粒度为:RID
pengdali 2003-08-21
  • 打赏
  • 举报
回复
1、用一UPDATE更新记录(保证一次只更新到一条),如何保证UPDATE只建立 行锁而不会表级锁?

re: sqlserver2000默认就是行琐

2、有一业务需要往某表插入记录,此表T1的增长速度大概为10000条/天,则一年后此表的容量为10000*360=360万条……
如此下去系统肯定会让用户难与忍受……做设计时候该如何处理? SQLSERVER中有分区试图的功能,能不能借助分区视图技术,

可以

每个月份建立一张数据表来存放数据,而通过分区试图技术,对外做查询统计时候所有按月份建立出来的表表现为一张表?怎么实现?

create table [2002年数据] (编号 int,年 int check(年=2002) default 2002,数据 int,primary key(编号,年))

create table [2003年数据] (编号 int,年 int check(年=2003) default 2003,数据 int,primary key(编号,年))

create view 所有数据 as
select * from [2002年数据]
union all
select * from [2003年数据]
go

注意写法,和约束

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧