mysql锁与事物隔离级别

锁的定义

  • 锁是计算机协调多个进程或线程并发访问某一资源的机制

锁分类

  • 性能:乐观锁与悲观锁
  • 操作:读锁和写锁(都属于悲观锁)
  • 粒度:表锁和行锁(MyISAM, Innodb)

行锁

  • 开销大
  • 加锁慢
  • 会出现死锁
  • 锁定力度小
  • 并发高
  • 偏向innodb引擎
  • 发生锁冲突概率最低
  • 事物是默认加行锁,在不提交时,始终会锁住。

事物与ACID属性

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

并发事物带来的问题

  • 更新丢失
    • 两个事物同时操作相同数据,后提交的事物会覆盖先提交的事物处理结果,通过乐观锁就可以解决。
  • 脏读
    • 事物A读取到了事物B已经修改但尚未提交的数据,如果事物B回滚,事物A读取的数据则无效,不符合一致性
  • 不可重读
    • 事物A读取到了事物B已经提交的修改数据,不符合隔离性
  • 幻读
    • 事物A读取到了事物B提交的新增数据,不符合隔离性

事物隔离级别

  • 查看数据库事物隔离级别:show variables like 'tx_isolation';
  • 设置数据库隔离级别:set tx_isolation='REPEATABLE-READ';
  • 默认的事物隔离级别时‘可重复读’
隔离级别 | 脏读 | 不可重复读 | 幻读
---|---|---|---
读未提交(read uncommitted) | 可能| 可能| 可能
读已提交(read committed) | 不可能| 可能| 可能
可重复读(repeatable read) | 不可能| 不可能| 可能
可串行化(serializable) | 不可能| 不可能| 不可能
  • 但是“可串行化”效率底下,一般不使用
  • 幻读是从快照中读取,从数据中更新
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容