MySQL 数据库基础

2019-03-27  本文已影响0人  cb_guo

表锁、行锁、页面锁

乐观锁、悲观锁、自旋锁

事务

事务就是一组原子性的 SQL 查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败

数据库的 ACID 了解吗?

  1. 原子性(Atomicity)
    一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。对于一个事务来说,不可能只执行其中的一部分操作,这就会事务的原子性
  1. 一致性(Consistency)
    数据库总是从一个一致性状态转换到另外一个一致性状态。在前面的例子中,一致性确保了,即使在执行第三、第四条语句之间时系统崩溃,支票账户中也不会损失 200 美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中

  2. 隔离性(Isolation)
    通常来说,一个事务所做的修改在最终提交以前,对其它事务是不可见的。在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外一个账户汇总程序开始执行,则其看到的支票账户余额并没有被减去 200 美元。

  3. 持久性(Durability)
    一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。

隔离级别

死锁

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。多个事务同时锁定同一个资源时也会产生死锁

InnoDB 存储引擎

InnoDB 是 MySQL 的默认事务型引擎,也是最重要、使用最广泛的存储引擎。
除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑 InnoDB 引擎。
默认级别是 可重复读,并通过间隙锁策略防止幻读的出现
InnoDB 表是基于聚簇索引建立的
InnoDB 数据存储在表空间中,表空间是由 InnoDB 管理的一个黑盒子,由一系列的数据文件组成
InnoDB 使用 B+ 树

MyISAM 存储引擎

MyISAM 不支持事务和行级锁,而且有一个毫无疑问的缺陷就是崩溃后无法完全恢复
MyISAM 对整张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入时会对表加排他锁

注意:除非需要用到某些 InnoDB 不具备的特性,并且没有其他办法替代,否则都应该优先选择 InnoDB 引擎

上一篇 下一篇

猜你喜欢

热点阅读