请教给数据表加锁的写法?

shiguangxin 2013-10-26 05:08:17
SQL2000:

有一个存储过程,在同一时间内只允许执行一次。也就是说在一个人执行的时候别人是不允许执行的。

BEGIN TRANSACTION
insert into T_A with(tablock) (SynDatetime,SynOperator) Values(getdate(),@OPNAME)
if @@ERROR=0 and @@ROWCOUNT>0
begin
set @RID=SCOPE_IDENTITY()
--------------
若干条 insert \ update \ delete \ select
--------------
update T_A set SynStatus=1,SynEnd=getdate() where SynID=@RID
end
COMMIT TRANSACTION

问题1:这种给表加锁的写法对吗?
我这样写是否可以保证 在事务执行期间 T_A 表是锁定的?
是否必须要像这样: select * from T_A WITH (tablock) 给表加锁?

问题2: tablock 换成 UPDLOCK 是否也行?就我的需要来说那个更好一些?

问题3:除了用锁以外还有没有更好的办法?

谢谢

...全文
6280 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2013-10-26
  • 打赏
  • 举报
回复
哦,可以的,你可以指定复制的条件,比如只复制分公司1的数据到分公司1,而且可以只复制某些列,这些都是可以的
shiguangxin 2013-10-26
  • 打赏
  • 举报
回复
谢谢 阳泉酒家小当家 的热心 从分公司往总公司上传数据是没有问题的 可是从总公司下载数据就有点麻烦,因为 12个分公司每家都有些自己的数据(比如一个产品 这家有 那家没有) 这就需要在总公司的数据表里有选择性的复制数据给每个分公司 不知道数据库复制技术可不可以支持这种功能?
LongRui888 2013-10-26
  • 打赏
  • 举报
回复
引用 12 楼 shiguangxin 的回复:
1个总公司 12个分公司 这样也可以使用数据库复制技术吗? 这个可得研究研究
可以的,一个总公司复制到12个分公司。 12个分公司都复制到总公司,其实每个分公司也只是把销售数据复制过去,其他的不用复制。
shiguangxin 2013-10-26
  • 打赏
  • 举报
回复
1个总公司 12个分公司 这样也可以使用数据库复制技术吗? 这个可得研究研究
LongRui888 2013-10-26
  • 打赏
  • 举报
回复
你用的是sql server 2000是不: 看看这个吧: http://wenku.baidu.com/view/731c5da0f524ccbff121840f.html
LongRui888 2013-10-26
  • 打赏
  • 举报
回复
那就用数据库复制吧,不过你这个是双向复制, 一方面,你需要把总公司的一部分数据,同步到分公司, 另一方面,你需要把分公司的销售数据,同步到总公司。 通过sql server 的数据库复制技术,就可以实现。
shiguangxin 2013-10-26
  • 打赏
  • 举报
回复
写这个存储过程的目的是用来数据同步。 分公司要从总公司下载数据, 然后同步本地库(新建、修改、删除) 分公司要向总公司上传销售数据 总公司与分公司的数据库通过VPN连接 目前的想法:所有的数据上传、下载都是通过应用程序调用存储过程来实现。 情况就是这么个情况 各位见多识广 小弟很是钦佩 不知到 有木有这样一种 省事省力 少写程序(最好不用写程序) 服务器之间自己就能安全可靠的同步数据 的功能? 啊啊
shiguangxin 2013-10-26
  • 打赏
  • 举报
回复
学习了 啊啊
LongRui888 2013-10-26
  • 打赏
  • 举报
回复
引用 3 楼 shiguangxin 的回复:
SET TRANSACTION ISOLATION LEVEL sql server 2000 有这个东东吗?
有滴,呵呵
Andy__Huang 2013-10-26
  • 打赏
  • 举报
回复
引用 3 楼 shiguangxin 的回复:
SET TRANSACTION ISOLATION LEVEL sql server 2000 有这个东东吗?
有呀,我都用过了。你使用报错吗?
LongRui888 2013-10-26
  • 打赏
  • 举报
回复
这个的关键是,在你的存储过程中,哪些操作是在同一时间,只能有一个用户来执行的, 是第一行的insert 操作,还是后面的update操作呢
专注or全面 2013-10-26
  • 打赏
  • 举报
回复
问题1:这种给表加锁的写法对吗? 我这样写是否可以保证 在事务执行期间 T_A 表是锁定的? 是否必须要像这样: select * from T_A WITH (tablock) 给表加锁? 这个写法没问题,你试一下就知道,开一个查询窗口 begin tran insert into dbo.T_A with(tablock) values (7,'G') 注意别提交也别回滚 再开一个查询窗口,随便查不管有没有where 条件,查询都别阻塞 问题2: tablock 换成 UPDLOCK 是否也行?就我的需要来说那个更好一些? 这个我只能说不一定,你不是要锁定整张表吗? 当表上存在索引的时候, begin tran insert into dbo.T_A with(tablock) values (7,'G') 注意别提交也别回滚 另外开一个查询窗口,查询其他(非上面插入的)数据,还是可以查询到的 (注意是表上有索引的情况) 问题3:除了用锁以外还有没有更好的办法? 那就是数据库设置更高的隔离级别了,列化读 不过这个不太现实,因为你只是要求这个地方在执行期间把表锁定 可序列化隔离级别时对全库的操作都执行此规则,所以不推荐
shiguangxin 2013-10-26
  • 打赏
  • 举报
回复
SET TRANSACTION ISOLATION LEVEL sql server 2000 有这个东东吗?
Andy__Huang 2013-10-26
  • 打赏
  • 举报
回复
有关锁的使用,或用什么锁,参考: http://blog.csdn.net/hdhai9451/article/details/9297763
Andy__Huang 2013-10-26
  • 打赏
  • 举报
回复
在执行事务前,加上事务的隔离级别: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED --未提交读 SET TRANSACTION ISOLATION LEVEL READ COMMITTED --已提交读 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ --获取一致的可重复读操作 SET TRANSACTION ISOLATION LEVEL SNAPSHOT --已提交读快照级 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE --系列化级别 五个级别只要加一个就可以了。 建议加这个级别:SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION .......... COMMIT TRANSACTION

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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