MySQL事务与锁知道多少?

33 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

1. 事务的隔离级别

  • 读未提交(Read uncommitted):

    • 一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证。
  • 读已提交(Read committed):

    • 一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生。
  • 可重复读(Repeatable read):

    • 就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生。
  • 串行(Serializable):

    • 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
  • Mysql的默认隔离级别是Repeatable read。

2. Mysql中的myisam与innodb的区别

  • InooDB支持事务,而MyISAM不支持事务
  • InnoDB支持行级锁,而MyISAM支持表级锁
  • InnoDB支持MVCC,而MyISAM不支持
  • InnoDB支持外键,而MyISAM不支持
  • InnoDB不支持全文索引,而MyISAM支持

3. 开启显式事务

  • set autocommit=0;

  • start transaction;#可以省略

4. 并发事务

  • 事务的并发问题是如何发生的?

    • 多个事务 同时 操作 同一个数据库的相同数据时
  • 并发问题都有哪些?

    • 脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据
    • 不可重复读:一个事务多次读取,结果不一样
    • 幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是 其他事务“插入”的数据
  • 如何解决并发问题

    • 通过设置隔离级别来解决并发问题
  • 隔离级别

    • read uncommitted:读未提交
    • read committed:读已提交 【脏读】
    • repeatable read:可重复读 【脏读】【不可重复读】
    • serializable:串行化 【脏读】【不可重复读】【幻读】

5. Mysql中有哪几种锁?

  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

6. NOW()和CURRENT_DATE()有什么区别?

  • NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。
  • CURRENT_DATE()仅显示当前年份,月份和日期。