一、InnoDB引擎的特点
主要特点如下:1、支持事务
2、支持行锁设计
3、提供一致性锁定读和一致性非锁定读(MVCC)
注:不同锁实现了事务不同的隔离级别
二、事务
1、事务的ACID特性
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
2、事务的隔离级别
READ UNCOMMIT(读未提交):可读到其他事务未提交的内容。该隔离级别会出现脏读现象
READ COMMIT(读提交):当前事务提交后立刻对其他事务可见。该隔离级别会出现不可重复读现象。
REPEATABLE READ(可重读):当前事务提交后,对于其他事务只有当其也提交了才可见。该隔离级别会出现幻读现象。
SERIALIZABLE(串行化):只有一个事务执行结束后才会执行下一个事务。
注:不同的隔离级别对应不同的锁
三、锁
1、锁的种类
<1> 两种行锁
种类:1、 共享锁(s):允许事务读一行数据。
2、 排他锁(x):允许事务删除或者更新一行数据
两种锁的兼容性
注:S、X都是行锁,兼容指的是对同一记录锁的兼容情况
<2> 意向锁
作用:为了支持多粒度的锁定方式,InnoDB添加贷一种额外的锁定方式。该锁定方式是将锁定对象分为多个层次。意味着事务希望在更细粒度上进行加锁。
种类:1、意向共享锁(IS):事务想要获得一张表中某几行的共享锁
2、意向排他锁(IX):事务想要获得一张表中某几行的排他锁
注:引擎支持的是行级别的锁。因此意向锁其实不会阻塞除全表扫描意外的任何请求。
<3> 两种锁的兼容性
2、一致性锁定读与一致性非锁定读
<1> 一致性锁定读
种类:for update():对读取的行添加一个X锁
lock in share mode:在读取的行上添加一个S锁
注:1、当where中的筛选条件为主键时则为行锁,当where中的条件为非主键时则为表锁。
2、for update的加锁方式比lock in share mode的方式多阻塞了select...lock in share mode的查询方式,但都不会阻塞快照读。
3、对查询添加后既不会读取快照
<2> 一致性非锁定读
作用:通过多版本控制的方法来读取当前执行时间数据库中的行数据。如果读取的数据正在进行insert、update不会等待锁释放,而是直接读取快照中的数据。
注:非锁定读是因为不需要等待行上的X锁的释放,而是读取之前版本的数据。这是与锁定度的根本区别
不同事务隔离级别下的数据读取:READ COMMITED:读取被锁定行的最新一份快照数据
REPEATABLE READ:读取事务开始时的行数据版本
3、事务隔离的加锁原理
READ UNCOMMIT:不加锁,但可以读取别人未提交内容,从而出现脏读现象。
READ COMMIT:不加锁,也不可读取别人未提交内容。但因为未加锁,读取过程可以修改数据,造成同一事务两次读取的数据不同,出现不可重复读现象(update)。
REPATABLE READ:加锁,但是可以插入,会造成同一事务中两次读取的数据条数不同,出现幻读 (insert、delete)。
SERIALIZABLE:读加共享锁,写加排他锁,读写互斥,使用的悲观锁的理论。但并发较差。
注:innoDB的默认隔离级别为REPATABLE READ,oracle为READ COMMIT
4、外键与锁
插入数据时会对父表加一个S锁,若父表被加了X锁则操作会被阻塞。
注:1、InnoDB会主动对外键加索引
2、表线上添加外键时都会在父表加一个s锁,而且通常都是锁住整个表。直到MySQL对外键检查完毕。