5 锁与事物隔离级别的优先级
手工指定的锁优先,
例20:
----------------------------------------
T1: GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
SELECT * FROM table (NOLOCK)
GO
T2: update table set column1='hello' where id=10
T1是事物隔离级别为最高级,串行锁,数据库系统本应对后面的select语句自动加表级锁,但因为手工指定了NOLOCK,所以该select
语句不会加任何锁,所以T2也就不会有任何阻塞。
6 数据库的其它重要Hint以及它们的区别
1) holdlock 对表加共享锁,且事物不完成,共享锁不释放。
2) tablock 对表加共享锁,只要statement不完成,共享锁不释放。
与holdlock区别,见下例:
例21
----------------------------------------
T1:
begin tran
select * from table (tablock)
T2:
begin tran
update table set column1='hello' where id = 10
T1执行完select,就会释放共享锁,然后T2就可以执行update. 此之谓tablock. 下面我们看holdlock
例22
----------------------------------------
T1:
begin tran
select * from table (holdlock)
T2:
begin tran
update table set column1='hello' where id = 10
T1执行完select,共享锁仍然不会释放,仍然会被hold(持有),T2也因此必须等待而不能update. 当T1最后执行了commit或
rollback说明这一个事物结束了,T2才取得执行权。
3) TABLOCKX 对表加排他锁
例23:
----------------------------------------
T1: select * from table(tablockx) (强行加排他锁)
其它session就无法对这个表进行读和更新了,除非T1执行完了,就会自动释放排他锁。
例24:
----------------------------------------
T1: begin tran
select * from table(tablockx)
这次,单单select执行完还不行,必须整个事物完成(执行了commit或rollback后)才会释放排他锁。
4) xlock 加排他锁
那它跟tablockx有何区别呢?
它可以这样用,
例25:
----------------------------------------
select * from table(xlock paglock) 对page加排他锁
而TABLELOCX不能这么用。
xlock还可这么用:select * from table(xlock tablock) 效果等同于select * from table(tablockx)
7 锁的超时等待
例26
SET LOCK_TIMEOUT 4000 用来设置锁等待时间,单位是毫秒,4000意味着等待
4秒可以用select @@LOCK_TIMEOUT查看当前session的锁超时设置。-1 意味着
永远等待。
T1: begin tran
udpate table set column1='hello' where id = 10
T2: set lock_timeout 4000
select * from table wehre id = 10
T2执行时,会等待T1释放排他锁,等了4秒钟,如果T1还没有释放排他锁,T2就会抛出异常: Lock request time out period exceeded.
8 附:各种锁的兼容关系表
| Requested mode | IS | S | U | IX | SIX | X |
| Intent shared (IS) | Yes | Yes | Yes | Yes | Yes | No |
| Shared (S) | Yes | Yes | Yes | No | No | No |
| Update (U) | Yes | Yes | No | No | No | No |
| Intent exclusive (IX) | Yes | No | No | Yes | No | No |
| Shared with intent exclusive (SIX) | Yes | No | No | No | No | No |
| Exclusive (X) | No | No | No | No | No | No |
9 如何提高并发效率
悲观锁:利用数据库本身的锁机制实现。通过上面对数据库锁的了解,可以根据具体业务情况综合使用事务隔离级别与合理的手工指定锁的方式比如降低锁的粒度等减少并发等待。
乐观锁:利用程序处理并发。原理都比较好理解,基本一看即懂。方式大概有以下3种
对记录加版本号.
对记录加时间戳.
对将要更新的数据进行提前读取、事后对比。
不论是数据库系统本身的锁机制,还是乐观锁这种业务数据级别上的锁机制,本质上都是对状态位的读、写、判断。
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。