内容概述:
我们知道,数据也是一种供许多用户共享访问的资源。如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素。从这一角度来说,锁对于数据库而言就显得尤为重要。接下来我们了解各种锁的特征。
1.1 表锁
表级锁是mysql锁中粒度最大的一种锁,表示当前的操作对整张表加锁,资源开销比行锁少,不会出现死锁的情况,但是发生锁冲突的概率很大。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好地避免困扰我们的死锁问题。InnoDB支持表级锁。但是默认的行锁,而且只有在查询或者其他SQL语句通过索引才会使用行锁。
1.2 行锁
行锁的是mysql锁中粒度最小的一种锁,因为锁的粒度很小,所以发生资源争抢的概率也最小,并发性能最大,但是也会造成死锁,每次加锁和释放锁的开销也会变大。目前主要是Innodb使用行锁。根据使用方式也分为共享锁(S锁或者读锁)和排它锁(X锁或者写锁)。
1.3共享锁(读锁,S锁)
共享锁的具体逻辑如下案例:
若事务A对数据对象o加上S锁,则事务A可以读数据对象o但不能修改,其他事务只能再对数据对象o加S锁,而不能加X锁,直到事务A释放数据对象o上的S锁。这保证了其他事务可以读数据对象o,但在事务A释放数据对象o上的S锁之前不能对数据对象o做任何修改。
语法和案例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
|