从数据访问层面来讲,可以把数据库锁分为共享锁(也叫读锁)和排他锁(也叫写锁):
读锁(共享锁)/ 写锁(排他锁):
读锁(共享锁):
- 事务开始之后,数据允许被访问查看。
两边线程开始事务,右边线程进行更新操作,读锁(共享锁)的存在,左边线程查询功能没有受到影响。
写锁(排他锁):
- 写锁(排他锁):写锁(排他锁)在使用的过程当中不允许被写入数据。
两边线程开始事务,右边线程进行更新操作,左边也进行更新操作,此时是因为写锁(排他锁)的存在,无法进行操作,因此没有任何反应。
表锁/行锁
行锁:
- 一次锁1~n行数据
右边更新,左边查询没有受到影响,左边写 id='1' 这一行受到影响。
左边修改id=‘2’ 这一行的数据,修改成功。
表锁:
- 一次锁整张数据
右边开始事务之后,修改整个表的数据,左边执行修改语句,无论是修改整个表还是某一行,都没有反应
乐观锁/悲观锁
乐观锁:
- 对事物保持乐观态度,认为不会有其他事务来修改数据,仅在更新(增删改查的操)前查询是否修改。一般数据库里面没有乐观锁,是通过自己在代码里面实现的。说白了乐观锁实际上是没有上锁的,是每次做一系列更新操作之前,先确认查询一遍,确认这个数据没有被之后再进行一系列的更新(增删改查)操作。
悲观锁:
- 对事务保持悲观态度,认为一定有其他事务来修改数据,所以操作时会加锁,不让其它事务操作。前面提到的所有的锁都是悲观锁。