当程序出现并发的情况时,为了保证数据安全,则需要一些手段来维持
1.行级锁
每次锁定的是一行数据的锁,它是由其他储存引擎实现的(非mysql)
- 优点:锁粒度小,争用率低,并发高
- 缺点:开销大,加锁慢,容易死锁
两种类型:共享锁和排他锁
使用行级锁定的主要是InnoDB
锁定机制的实现过程中为了让行级锁定和表级锁定共存,而有了意向共享锁和意向排他锁,如果自己需要一个共享锁,那么就在表上面添加一个意向共享锁,如果自己需要一个排他锁,那么就在表上面添加一个意向排他锁
- 意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在
InnoDB行锁是给索引上的索引项加锁.注意事项:
- 如果不通过索引条件检索数据时,InnoDB将使用表锁
- 行锁是针对索引来加的锁,而不是记录,所以在访问不同行的记录时,如果使用了相同的索引键,还是会出现锁冲突的。
- 在一些很小的表,mysql为了使效率更高而不会使用索引,这种情况下InnoDB将使用表锁
2.表级锁
每次锁定的是一张表的锁
- 优点:开销小,速度快,表级锁一次会将整个表锁定,能较好的避免死锁问题
- 缺点:锁粒度最大,并发低
两种类型:表共享读锁和表独占写锁
使用表级锁定的主要有MyISAM,MEMORY,CSV等一些非事务性存储引擎
- 读操作不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作
- 写操作会阻塞其他用户对同一表的读和写操作
查看表级锁的争用情况:show status like ‘table%’;
3.乐观锁
只在数据进行更新时才会进行冲突检测,如果发现冲突则返回信息给用户
- 乐观锁一般实现方式是记录数据版本
- 它假设发生冲突的可能性小,只在提交的时候才去锁定
- 优点:可大大避免数据库幻读,业务处理时间过长等原因引起数据处理错误
- 缺点:更新失败的概率会比较高,容易发生业务失败
4.悲观锁
在修改数据之前先锁定,再修改
- 它假设发生冲突的可能性大,所以需要在修改之前先加锁
- 依靠数据库提供的锁机制
- 优点:据处理的更安全
- 缺点:效率较差,增加了锁死的机会
两种分类:共享锁和排他锁
- 共享锁又称读锁,可以多用户共享一把锁
- 排他锁又称写锁,不能与其他锁共存