文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 招聘 专题 新闻
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» 微软SQL Server专区 » SQL Server数据库管理 » 帮忙看看如何在这段代码前后给数据库写加锁和解锁语句       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: 帮忙看看如何在这段代码前后给数据库写加锁和解锁语句  ( 查看:279  回复:2 )   
 该主题悬赏的20无忧币已被全部领完 
 
飘来荡去
新新人类  点击可查看详细



帖子 13
精华 0
无忧币 48
积分 33
阅读权限 20
注册日期 2007-9-28
最后登录 2007-11-8 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-11-4 10:23   标题:帮忙看看如何在这段代码前后给数据库写加锁和解锁语句
上一帖 |
'(在这里给数据库加锁,如何写加锁语句?)
        ...............
        i   =   str(从记录集rst0中得到最大入库单号)
        '若不加锁,在这容易造成并发冲突。因为在申请到最大入库单号之后还没有来得及建立实际记录,其它客户端可能也申请到了同样的入库单号
        ..............
        rst.open   "select   *   from   入库   where   入库单号= "   +   i   +   "   and   商品ID=0 ",   cn,   adOpenStatic,   adLockOptimistic
        If   rst.RecordCount   =   0   Then   下一个入库单号   =   i   +   1
        ...............
        '(在这里给数据库解锁,如何写解锁语句?)



网络工程师到底该不该去考CCIE认证?
2007-11-4 10:231楼
[ 顶部 ]
 
cool技
助理工程师  点击可查看详细



帖子 431
精华 1
无忧币 2202
积分 1174
阅读权限 40
注册日期 2007-4-3
最后登录 2007-12-3 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-11-4 10:23  该回复被 飘来荡去 奖励 20 点无忧币
此回复于2007-11-17 08:08被 阿楚 评为最佳答案

先将需要加锁执行的语句声明成一个事务(如2楼),然后加锁,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   指定该锁,这种情况下排它锁适用于适当级别的粒度。



网络工程师到底该不该去考CCIE认证?
2007-11-4 10:232楼
[ 顶部 ]
 
嚣张不了
新新人类  点击可查看详细



帖子 49
精华 0
无忧币 153
积分 145
阅读权限 20
注册日期 2007-8-30
最后登录 2007-12-2 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-11-4 10:23 
要使一表在整个处理过程中不会被并发修改
可用事务
begin   tran
select   *   from   表名   with   HOLDLOCK  
--处理语句
........
............


commit   tran


加了   with   holdlock后,在事务提交之前,别人动不了你的表



网络工程师到底该不该去考CCIE认证?
2007-11-4 10:233楼
[ 顶部 ]
     
论坛跳转:  

| | |

| | |

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号