msyql 锁
读锁
写锁
锁的粒度:Innodb 到行,MyIsam 到表
查看当前表是否加锁:
show open tables;
给指定表orders 和order_details 分别加读锁和写锁:
lock table orders read, order_details write
解锁所有表:
unlock tables;
总而言之,读锁会阻塞写,但是不会堵塞读,而写锁则会把读和写都阻塞
InnoDB:
事务(ACID)
原子性:atomicity 事务是一个原子操作单元,其对数据的修改,要么全部执行,要么全部不执行
一致性:Consistent 在事务开始和完成,数据都必须保持一致的状态。
隔离性:Isolation 对数据库系统提供一定的隔离机制,保证事务在不受外部并发操作的影响“独立”环境的运行,这个就意味着事务处理的中间状态对外部是不可见的,反之亦然。
持久性:Druable 事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持
事务
原子性:数据的修改,要么全部执行,要么不执行
一致性: 事务的开始和完成,数据都保持一致的状态
隔离性:事务处理的中间状态对外部不可见
持久性:事务完成之后,对数据的修改是永久性的
脏读:一个事务对一条记录做了修改,在这个事务完成和提交之前,这条记录数据处于一个不一致的状态,这时另外一个事务也读取到这条记录,如果不加控制,第二个事务就会读取到脏数据,并据此数据做进一步处理,就会产生未提交的数据依赖关系,这种现象就是脏读。
一句话:事务A读到了事务B的修改未提交的数据,在此数据的基础做了操作,此时如果事务B事务回滚,A读取的数据无效,不符合事务的一致性。
不可重复读:一个事务在读取数据后的某些时间,又一次的重复读该数据,发现此数据已经更改,或者删除,这种现象叫做“”不可以重复读“”
事务A读到事务B已经提交修改过的数据,不符合隔离性。
幻读:事务A读取到事务B新增的数据,不符合隔离性
脏读:事务A读取到事务B修改的数据,不符合隔离性
查看事务隔离级别:
show variables like “tx_isolation”
关闭事务自动提交:
set autocommit = 0
开启事务制动提交
set autocommit = 1
事务的隔离级别:
未提交读:read uncommited
已提交读:read commited
可重复读:repeatable read (my sql默认的隔离级别)解决了脏读和不可重复读。
可序列化:serializble
索引使用不当,会失效,也有可能行锁变为表锁
间隙锁:如果使用范围查询而不是采用等值查询,mysql会锁定这个范围内的所有索引的值,及时这个键值不存在也会被锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据,而在某些应用场景下会对性能造成很大的危害。
如何分析行锁?
show status like "%innodb_row_lock%"