行锁的基本说明:

SELECT au_lname FROM authors WITH (NOLOCK)

锁定提示                                 描述  
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        指定该锁,这种情况下排它锁适用于适当级别的粒度

1 如何锁一个表的某一行

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT * FROM table ROWLOCK WHERE id = 1

2 锁定数据库的一个表

SELECT * FROM table WITH (HOLDLOCK)

加锁语句: 
sybase: 
update 表 set col1=col1 where 1=0 ; 
MSSQL: 
select col1 from 表 (tablockx) where 1=0 ; 
oracle: 
LOCK TABLE 表 IN EXCLUSIVE MODE ; 
加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁

几个例子帮助大家加深印象 
设table1(A,B,C) 
A B C 
a1 b1 c1 
a2 b2 c2 
a3 b3 c3

1)排它锁 
新建两个连接 
在第一个连接中执行以下语句 
begin tran 
update table1 
set A='aa' 
where B='b2' 
waitfor delay '00:00:30' --等待30秒 
commit tran 
在第二个连接中执行以下语句 
begin tran 
select * from table1 
where B='b2'  
commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒

2)共享锁 
在第一个连接中执行以下语句 
begin tran 
select * from table1 holdlock -holdlock人为加锁 
where B='b2'  
waitfor delay '00:00:30' --等待30秒 
commit tran

在第二个连接中执行以下语句 
begin tran 
select A,C from table1 
where B='b2'  
update table1 
set A='aa' 
where B='b2'  
commit tran

若同时执行上述两个语句,则第二个连接中的select查询可以执行 
而update必须等待第一个事务释放共享锁转为排它锁后才能执行 即要等待30秒

3)死锁 
增设table2(D,E) 
D E 
d1 e1 
d2 e2 
在第一个连接中执行以下语句 
begin tran 
update table1 
set A='aa' 
where B='b2'  
waitfor delay '00:00:30' 
update table2 
set D='d5' 
where E='e1'  
commit tran

在第二个连接中执行以下语句 
begin tran 
update table2 
set D='d5' 
where E='e1'  
waitfor delay '00:00:10' 
update table1 
set A='aa' 
where B='b2'  
commit tran

同时执行,系统会检测出死锁,并中止进程

补充一点: 
Sql Server2000支持的表级锁定提示

HOLDLOCK 持有共享锁,直到整个事务完成,应该在被锁对象不需要时立即释放,等于SERIALIZABLE事务隔离级别

NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别

PAGLOCK 在使用一个表锁的地方用多个页锁

READPAST 让sql server跳过任何锁定行,执行事务,适用于READ UNCOMMITTED事务隔离级别只跳过RID锁,不跳过页,区域和表锁

ROWLOCK 强制使用行锁

TABLOCKX 强制使用独占表级锁,这个锁在事务期间阻止任何其他事务使用这个表

UPLOCK 强制在读表时使用更新而不用共享锁

应用程序锁: 
应用程序锁就是客户端代码生成的锁,而不是sql server本身生成的锁

处理应用程序锁的两个过程

sp_getapplock 锁定应用程序资源

sp_releaseapplock 为应用程序资源解锁

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

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

SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除

1 如何锁一个表的某一行 
/* 
        测试环境:windows 2K server + Mssql 2000 
        所有功能都进行测试过,并有相应的结果集,如果有什么疑义在论坛跟帖 
        关于版权的说明:部分资料来自互联网,如有不当请联系版主,版主会在第一时间处理。 
        功能:sql遍历文件夹下的文本文件名,当然你修改部分代码后可以完成各种文件的列表。 
*/

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)  
其他事务不能读取表,更新和删除

有关数据库行、锁 的几个问题(rowlock)的更多相关文章

  1. SQLServer之数据库行锁

    行锁使用注意事项 1.ROWLOCK行级锁确保在用户取得被更新的行,到该行进行更新,这段时间内不被其它用户所修改.因而行级锁即可保证数据的一致性,又能提高数据操作的并发性. 2.ROWLOCK告诉SQ ...

  2. 数据库进阶之路(五) - MySQL行锁深入研究

    由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统:假设id=1的这本书库存为1,但是有2个人同时来借这本书,此处的逻辑为: ; --如果restnum大于0,执行u ...

  3. 关于mysql数据库行级锁的使用(一)

    项目上一个业务需要对某条数据库记录加锁,使用的是mysql数据库 因此做了一个关于mysql数据库行级锁的例子做测试 package com.robert.RedisTest; import java ...

  4. Java如何实现对Mysql数据库的行锁

    场景如下:     用户账户有余额,当发生交易时,需要实时更新余额.这里如果发生并发问题,那么会造成用户余额和实际交易的不一致,这对公司和客户来说都是很危险的. 那么如何避免:     网上查了下,有 ...

  5. 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁

    转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...

  6. 浅析postgresql数据库事务及行锁特征

    开源数据库领域,postgresql以其优越的性能.功能及良好的稳定性排名首位可谓当之无愧,尤其是对高并发的支持可谓匠心独具.而优越的性能和稳定性,究其根本无非是良好的基础架构,本文将对其性能和稳定性 ...

  7. MySQL数据库 InnoDB引擎 事务及行锁总结

    一.事务 1.事务的四大特性 (1)原子性:事务开始后所有的操作要么一起成功,要么一起失败,整个事务是一个不可分割的整体. (2)一致性:是物开始前到结束后,数据库的完整性约束没有被破坏. (3)隔离 ...

  8. 事务的实现就是利用数据库锁(行锁,表锁等),且db上锁,都是在操作之前上锁

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据 ...

  9. 浅谈SQL Transaction在请求中断后的行锁表锁

    最近在维护Web Service接口时,由于数据数据量达到千万级别,接口调用不时出现错误让人不胜烦恼,经过性能测试查出瓶颈在数据库数据处理上,可着实忙了一番.相信众多程序猿和DBA都会头痛性能的问题, ...

随机推荐

  1. 什么是REST?

    云计算的时代越来越多的提到一个词REST,那么什么是REST?如果你还不清楚,可以看这个视频和系列教程: http://www.restapitutorial.com/lessons/whatisre ...

  2. Android添加快捷方式(Shortcut)到手机桌面

    Android添加快捷方式(Short)到手机桌面 权限 要在手机桌面上添加快捷方式,首先需要在manifest中添加权限. <!-- 添加快捷方式 --> <uses-permis ...

  3. Android--ListView下拉刷新

    整理了下以前写的小项目,ListView的下拉刷新,虽然小但还是想纪念下..适合新手看,大神略过... 效果图:     代码:  实体类 package com.example.listviewre ...

  4. 更新CocoaPods碰到的问题及知识点

    1:解决CocoaPods安装时报的问题,http://ruby.taobao.org/latest_specs.4.8.gz 报404 解决 bad response Not Found 404 ( ...

  5. 【代码笔记】iOS-检测手机翻转

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  6. 使用xmarks同步 chrome ie firefox safari书签

    xmarks是什么? Install Xmarks on each computer you use, and it seamlessly integrates with your web brows ...

  7. 数据库 SQL语句小结(更新中)

    ################ Navicat,单条执行sql ################ Navicat,数据库管理工具, 在查询的页面有好多命令,若单条执行: 1:可选中要执行的一条sql ...

  8. Centos中jdk的环境配置

    在Centos中,进行配置jdk的环境,这个还是折腾了我听挺久的.特别是,在一次配置中,导致后来我的root用户无法登录,并且用其他普通用户登录,使用su - root切换到root用户,都无法使用l ...

  9. SSIS技巧--优化数据流缓存

    问题 我们经常遇到一种情况,在SSMS中运行很慢的一个查询,当把查询转化成从源到目的数据库的SSIS数据流以后,需要花费几倍的时间!源和数据源都没有任何软硬件瓶颈,并且没有大量的格式转换.之前看了很多 ...

  10. Dubbo 分布式服务框架(spring、zookeeper)

    DUBBO DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架, alibaba资源 源码:https://github.com ...