编程知识 cdmana.com

锁的模式有3种
行级锁,页级锁,表级锁。它们的加锁开销从大到小,并发能力也是从大到小.


MyISAM默认是表锁模式:锁的作用范围是整张表
锁的类别:
(●)表共享读锁(读锁S)
若事务A对表table1加上读锁,则事务A可以读表table1但不能修改表table1,其他事务只能再对表table1加读锁,而不能加写锁,直到事务A释放表table1上的读锁。
(●)表独占写锁(写锁X)
若事务A对表表table1加上写锁,事务A可以读表table1也可以修改表table1,其他事务不能再对表table1加任何锁,直到事务A释放表table1上的锁。


InnoDB默认是行锁模式:锁的作用范围是行级别。数据库能够确定那些行需要锁的情况下使用行锁(使用索引),如果不知道会影响哪些行的时候就会使用表锁(未使用索引)。
锁的类别:
(●)共享锁(读锁S)
若事务A对数据对象data1加上读锁,则事务A可以读数据对象data1但不能修改数据对象data1,其他事务只能再对数据对象data1加读锁,而不能加写锁,直到事务A释放数据对象data1上的读锁。
加共享锁可以使用语句:select … lock in share mode
(●)排他锁(写锁X)
若事务A对数据对象data1加上写锁,事务A可以读数据对象data1也可以修改数据对象data1,其他事务不能再对数据对象data1加任何锁,直到事务A释放数据对象data1上的锁。
加排他锁可以使用语句:select … for update


*************************************************************************


锁的俩种机制
悲观锁:数据库锁机制。
乐观锁:用户自己实现的一种锁机制。


悲观锁
顾名思义,就是很悲观,它对于数据被外界修改持保守态度,认为数据随时会修改,所以整个数据处理中需要将数据加锁。悲观锁一般都是依靠数据库提供的锁机制,事实上数据库中的行锁和表锁的读写锁都是悲观锁。


乐观锁
顾名思义,就是很乐观,每次自己操作数据的时候认为没有人回来修改它,所以不去加锁,但是在更新的时候会去判断在此期间数据有没有被修改,需要用户自己去实现。既然都有数据库提供的悲观锁可以方便使用为什么要使用乐观锁呢?对于读操作远多于写操作的时候,大多数都是读取,这时候一个更新操作加锁会阻塞所有读取,降低了吞吐量。最后还要释放锁,锁是需要一些开销的,我们只要想办法解决极少量的更新操作的同步问题。如果读和写的操作数量差不多或者你的系统没有响应不及时,吞吐量瓶颈问题,那就不要去使用乐观锁,它增加了复杂度,也带来了额外的风险。


俩种常用的乐观锁实现方式
(1)版本号标识:给表增加一个字段version,每次更新要把这个字段的值加1。
实现原理:读取的时候要读取version,更新的时候对比当前version和读取时version是否相等,通过影响行数是否为0来得到更新结果(为0则失败,大于0则成功)。
(2)待更新字段(推荐使用,性能更好):使用现有表的字段做版本号标识。
例子:
select user_name, age from user where user_id = 1;  //此时读取的age为28
update user set money = 3000 where user_id = 1 and age = 28;  //对比当前age和读取时age
 

版权声明
本文为[仰望无尽星空]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/3538786/blog/4969314

Scroll to Top