锁的定义
锁是协调多个进程或线程访问某一共享可变资源,防止并发造成不可预见性的问题
锁分类
- 性能上分为乐观锁(版本控制实现)和悲观锁
- 数据库操作的类型上分为读锁(共享锁)和写锁(排它锁)
- 对数据的操作粒度上分为表锁和行锁
表锁
每次操作直接锁住整张表,加锁快,开销小,不会出现死锁,但锁的粒度大,发生锁冲突的概率高,并发效率低
MyISAM存储引擎支持表锁
对MyISAM进行读操作时不会影响别的进程的对同一张表的读操作,但会阻止对该张表的写操作,只有读锁释放后才能进行写锁加锁
对MyISAM进行写操作时会阻塞别的进程加读锁和写锁,只有写锁释放后才能执行别的进程的读写
行锁
对行记录进行加锁,开销大,加锁慢,会出现死锁,但锁的粒度小,发生锁冲突的概率低,并发效率高
InnoDB与MyISAM最大的区别
- 支持事务
- 支持行级锁
事务
事务的四大特性(ACID)
- 原子性:事务是一个原子操作,同一个事务里多个更新操作要么同时成功,要么同时失败
- 一致性:事务对数据完整性的约束,数据执行完成后属于合法的状态,不会违背任何的数据完整性,比如A转账给B,A和B总共5000元,不论A与B之间如何转账,总金额不会发生改变。一致性是为了保障数据的完整性。
- 隔离性:多个用户并发操作同一数据库,数据库为每个用户开启的事务,不被其他事务所干扰,事务之间彼此独立
- 持久性:事务完成后对数据的修改是永久的,即使数据库发生故障数据也不会丢失
并发事务带来的问题
-
更新丢失:多个事务并发操作某行记录,会出现后修改的事务覆盖前面的事务所做的更新
-
脏读:多个事务并发操作时,事务A在处理数据过程中读取到了事务B已经修改但未提交的数据,如果事务B回滚后,事务A读取的数据无效,不符合事务的一致性。
-
不可重复读:多个事务并发操作时,一个事务多次查询某一个行数据返回不同的结果值
事务A读取到事务B已经提交的修改数据,不符合事务的隔离性。
-
幻读:多个事务并发操作时,事务A读取到事务B提交的新数据,不符合事务的隔离性
事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
MySQL默认事务隔离级别
可重复读(repeatable-read)
-- 查看当前数据库事务隔离级别
SHOW VARIABLES LIKE 'tx_isolation';
-- 设置事务隔离级别
SET tx_isolation='REPEATABLE-READ';
网友评论