锁的定义
- 锁是计算机协调多个进程或线程并发访问某一资源的机制
锁分类
- 性能:乐观锁与悲观锁
- 操作:读锁和写锁(都属于悲观锁)
- 粒度:表锁和行锁(MyISAM, Innodb)
行锁
- 开销大
- 加锁慢
- 会出现死锁
- 锁定力度小
- 并发高
- 偏向innodb引擎
- 发生锁冲突概率最低
- 事物是默认加行锁,在不提交时,始终会锁住。
事物与ACID属性
并发事物带来的问题
- 更新丢失
- 两个事物同时操作相同数据,后提交的事物会覆盖先提交的事物处理结果,通过乐观锁就可以解决。
- 脏读
- 事物A读取到了事物B已经修改但尚未提交的数据,如果事物B回滚,事物A读取的数据则无效,不符合一致性
- 不可重读
- 事物A读取到了事物B已经提交的修改数据,不符合隔离性
- 幻读
事物隔离级别
- 查看数据库事物隔离级别:
show variables like 'tx_isolation';
- 设置数据库隔离级别:
set tx_isolation='REPEATABLE-READ';
- 默认的事物隔离级别时‘可重复读’
隔离级别 | 脏读 | 不可重复读 | 幻读
---|---|---|---
读未提交(read uncommitted) | 可能| 可能| 可能
读已提交(read committed) | 不可能| 可能| 可能
可重复读(repeatable read) | 不可能| 不可能| 可能
可串行化(serializable) | 不可能| 不可能| 不可能
- 但是“可串行化”效率底下,一般不使用
- 幻读是从快照中读取,从数据中更新
网友评论