数据库只对原子操作(Sql语句与事务)加锁。大体如下:
问题:事务本来包含多个单句,那么事务加了锁,单句还要加吗?
解答:这是个重要的问题,在数据库的实际设计中,的确没有划清界线,有了事务锁了,就不要语句锁了。在事务中,我们称事务锁为大锁,语句锁为小锁;而且只有共享锁分大小,而排斥锁不分(因为都是大锁)。继续往下看,就明白了。
三种级别行锁都来一遍,就清楚了。
一、读未提交(Read Uncommitted)。读不加任何锁,写加共享锁。
二、读已提交(Read committed)。读加小共享锁,写加排斥锁。(这一点特别重要)。这个级别是默认的,无论对于事务还是语句。
(注)在上面两条Select语句之间是没有锁的,所以其它查询是可以进行获取锁而改变数据的。这一点是读已提交级别的核心。这也是此级别会产生不可重复性读的问题的原因。
三、可串行读(Repeatable Read)。读加大共享锁,写加排斥锁。(这一点特别重要)
可见:
1、数据库两个写操作之间,必须串行,即使在最低级别。
2、数据库两个读操作之间,必须并行,即使在最高级别。
3、数据库的写操作,必须加锁,即使在最低级别。也就保证了写的独立性。
4、数据库的读操作,永远不会加排斥锁,保证了读的共享性。
网友评论