锁模块之MyISAM与InooDB(锁方面的区别、事务并发访问引起的问题以及应如何避免、InooDB可重复读隔离级别下如何避免幻读)

  • MyISAM与InnoDB关于锁方面的区别:

1 MyISAM默认用的是表级锁,不支持行级锁。
2 InnoDB默认用的是行级锁,也支持表级锁。

读锁也被称为共享锁。写锁又被称为排他锁
加锁:lock tables ---- read|write
unlock tables
lock in share mode
上了写锁再上写锁、读锁需要等待。

for update:就是为了加锁,即在当前线程操作修改数据库记录并提交之前,其他线程没法对同一记录进行改动

  • MyISAM适合的场景

频繁执行全表count语句
对数据进行增删改的频率不高,查询非常频繁
没有事务

  • InnoDB适合的场景

数据增删改查都相当频繁(该某行数据只需要行锁)
可靠性要求比较高,要求支持事务

数据库锁的分类

  • 数据库事务的四大特性

原子性:要么都做,要么都不做
一致性:转账为例
隔离性:多个事务并发执行时,互补影响
持久性:事务一旦提交对数据库的修改永久保存

  • 事务并发访问引起的问题以及应如何避免

查询事务隔离级别:select@@tx_isolation

1、 更新丢失(事务A对数据进行操作时,事务B也在对同一数据更新操作并完成了提交,然后事务A遇到异常进行回滚导致事务B的更新丢失。)——mysql所有事物隔离级别在数据库层面上均可避免
2、 脏读(一个事务读到另一个事务未提交的数据。)——READ-COMMIITTED事务隔离级别以上可以避免
(设置隔离级别:set session transaction isolation level (read-committed))
3、 不可重复读(事务A在多次读取同一数据的过程中,事务B对数据进行更新并提交,导致事务A多次读取同一数据时结果不一致。)——REPEATABLE-READ事务隔离级别以上可以避免
4、幻读(事务A读取若干行数据,事务B以插入或删除行的方式来修改事务A的结果集。)——SERIALIZABLE事务隔离级别可以避免
其中不可重复读与幻读比较相似,不可重复读侧重对同一数据的修改,幻读侧插入增或删除数据。
事务隔离级别越高,对性能的影响也越大。

  • 当前读和快照读

当前读:
1、select …lock in share mode(共享)
2、select…for update(排他)
3、update delete insert(排他)

快照读
1、不加锁的非阻塞读,select

  • InooDB可重复读隔离级别下如何避免幻读
    表象读:快照读(非阻塞读)–伪MVCC
    内在:next-key锁(行锁+gap锁)

对主键索引或者唯一索引会用Gap锁吗?

如果where条件全部命中,则不会用Gap锁,只会加记录锁。
如果where条件部分命中或全不命中,则会加Gap锁

猜你喜欢

转载自blog.csdn.net/qq_37873484/article/details/87894546