一.概述
在数据库中,数据是属于共享资源,为了保证并发访问的一致性,有效性,产生了锁。接下来重点讨论mysql锁机制的特点,常见的锁问题,以及解决mysql锁问题的一些方法或建议。 相比其他数据库,mysql 锁机制比较简单,显著的特点是:不同的存储引擎支持不同的锁机制。在innodb中支持行锁和表锁,默认行锁。
mysql 的三种锁归纳如下:
表级锁:开销小,加锁快,不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度最高。
页面锁:开销和加锁时间界于表锁和行锁之间,会出现死锁,并发度一般。
在不同sql语句执行,会采用不同的锁,由mysql 内部自动加锁,解锁,以及对应的锁类型。重点介绍mysql表锁和innodb行锁。由于MyisAm将被innodb取代了,后面重点讲innodb。
1. 事务介绍
innodb的二个特点是:1是支持事务,2是采用行级锁。但事务的引入也带来了一些新问题,先介绍一下背景知识。
1.1 事务及其属性ACID
事务是同一组sql语句组成的逻辑处理单元,具有原子性,一致性,隔离性,持久性。
1.2 并发事务处理带来的问题
更新丢失,脏读,不可重复读,幻读。
1.3 事务隔离级别
由于并发事务处理带来的问题,那么解决方法就是对应不同的事务隔离级别。 数据库实现事务隔离的方式,基本上分为以下两种:
(1)一种是在读取数据前,对其加锁,阻止其他事务对数据进行修改。
(2)另一种是不用加任何锁,通过快照 Snapshot 形式的 “数据版本并发控制” (MultiVersion Concurrency Control)简称MVCC。
数据库的事务隔离级别越严格,并发副作用越小,付出的代价也就越大,因为实质上就是使事务在一定程度上"串行化"进行,这与"并发"是矛盾的。
下面是四种隔离级别:
2. 隔离级别查看
-- 查看事务隔离级别,默认是REPEATABLE-READ,在sql server里默认是Read Committed
SELECT @@tx_isolation
关于事务,事务并发问题,事务隔离级别,它们的原理这里有详细介绍“sql server 锁与事务拨云见日”。(未完)