锁是一种并发控制技术,锁是用来在多个用户同时访问同一个数据的时候保护数据的。
乐观锁
认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般通过版本号或CAS操作实现。
悲观锁
总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁,如读锁、写锁和行锁,当其他线程想要访问数据时,都需要阻塞挂起。可以依据数据库实现,在操作之前挂锁,Java中的synchronized的思想也是悲观锁。
悲观锁中的 2 种基本的锁类型
(1)共享锁称为读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加s锁,但不能加X锁,直到T释放A上加的锁。
(2)排他锁又称写锁,若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。即自己独占资源.
MySQL 各存储引擎使用了三种类型(级别)的锁定机制
A.表级锁, 直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作。如果你是写锁,则其它进程则读也不允许。(1)特点:开销小,加锁快;不会出现死锁;锁定粒度最大,发生锁冲突的概率最高,并发度最低。
(2)MyISAM 存储引擎采用的是表级锁。有 2 种模式:表共享读锁和表独占写锁。
(3)加读锁的命令:lock table 表名 read;去掉锁的命令:unlock tables。
(4)支持并发插入:支持查询和插入操作并发进行(在表尾并发插入)。
(5)锁调度机制:写锁优先。一个进程请求某个 MyISAM 表的读锁,同时另一个进程也请求同一表的写锁,MySQL 如何处理呢?答案是写进程先获得锁。
B.行级锁, 仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。
(1)特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
(2)InnoDB 存储引擎既支持行级锁,也支持表级锁,但默认情况下是采用行级锁。
(3)共享锁(s):Select * from tableName where … lock in share mode;
(4)排他锁(X):Select * from tableName for update;
C.页级锁, 一次锁定相邻的一组记录。开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
(1)最常用的处理多用户并发访问的方法是加锁。当一个用户锁住数据库中的某个对象时,其他用户就不能再访问该对象。
(2)加锁对并发访问的影响体现在锁的粒度上。比如,(表锁)放在一个表上的锁限制对整个表的并发访问;(页锁)放在数据页上的锁限制了对整个数据页的访问;(行锁)放在行上的锁只限制对该行的并发访问。
数据库的锁机制
最新推荐文章于 2024-08-23 20:00:57 发布