听说微信搜索《Java鱼仔》会变更强哦!
本文收录于
(一)概述
我们把那些可能会被多个线程同时操作的资源称为临界资源,加锁的目的就是让这些临界资源在同一时刻只能有一个线程可以访问。这是当时在讲synchronized锁时提出的锁的概念。
数据库作为用户共享的一个资源,如何保证数据并发访问一致性也是所有数据库必须解决的问题,如何加锁是数据库并发访问性能的一个重要因素。
(二)关于数据库的锁
从加锁形式上分为乐观锁和悲观锁
从对数据库操作的类型分为读锁(共享锁)和写锁(排他锁)
读锁:多个读操作可以同时进行不会互相影响 写锁:当前写操作没有完成前,会排斥其他的读锁和写锁
从数据操作粒度上可以分为表锁和行锁
2.1 表锁
顾名思义,表锁就是锁住整张表。这种操作开销小,加锁快,不会出现死锁,但是锁的粒度大,并发度低。MyISAM引擎在操作数据时就会自动给数据加上表锁。
可以通过下面几个参数手动增加表锁:
lock table 表名 read(write)
查看表上加过的锁:
show open tables;
删除锁:
unlock tables;
加了读锁后,将限制写入;加了写锁之后,将限制读和写;
2.2 行锁
行锁就是锁住一行数据,这种做法开销大,加锁慢,会出现死锁。但是锁的粒度小,并发度最高。InnoDB支持行锁,同时InnoDB还支持事务。
通过一个简单的例子来介