事务
事务是希望mysql数据库将多条sql语句作为整体进行处理;因为有多条连接,可能出现多个并发事务处理;在这多个并发处理的事务中,可能乱序交叉执行,我们需要解决这乱序交叉执行的问题,让数据库知道接下来的语句是一个事务;
发送start transaction | begin给mysql,是发送了具体的协议,mysql会返回是否开启事务成功的结果;开启事务成功后可能有多个sql语句发给mysql;最后commit提交事务,同样是发送了具体的协议,mysql会返回是否提交事务成功的结果;事务提交成功后,mysql会对事务执行的结果整体进行持久化;
acid特性
1)原子性,一个事务要么都做要么都不做;
2)一致性,数据库完整约束的一致性,还有唯一约束,非空约束,外键约束等,这些约束在事务的操作过程中到操作结束,它的一致性不会受到影响;一致性通常是由原子性,一致性,隔离性,持久性一起来实现的;
3)隔离性,acid中最重要的一个特性,通常是由原子性,一致性,持久性一起来实现的;程序员可以修改隔离级别,通过了解隔离级别内部的原理,进行相应的处理;目的是用来防止多个并发事务交叉执行导致数据的不一致性;隔离性通过加锁和mvcc来实现;
4)持久性,对数据库的变更进行持久化,落到磁盘中;持久性通常使用redolog来实现,redolog是事务提交后,记录dml操作对应物理页修改的内容;undolog记录了dml操作步骤,用于回滚,通过逆运算回滚;mvcc记录事务dml操作提交后产生行数据版本信息;
隔离级别
隔离级别的目的是为了提升并发性能,读和写全部加锁是级别最高的隔离级别,但是效率是最低的;mysql采用的是repeatable read隔离级别,oracle采用的是read committed隔离级别;
MVCC
mvcc即一致性非锁定读,其核心是read view来实现的;
聚集索引记录的隐藏列;
mvcc原理由聚集索引记录的隐藏列和read view来决定;聚集索引记录的隐藏列和read view都是为了解决事务可见性的问题;事务可见性问题即事务之间我们能看到事务之间的哪些数据;事务可以看到事务本身修改的数据;
锁
全局锁,用于锁数据库,整个库是可读的状态;
表级锁分为表锁,元数据锁,意向锁,auto-inc锁; 表锁加锁后自己也不能操作;元数据锁用于数据在修改的时候不能让其他连接修改这个表的结构,一个在修改表结构,一个在修改数据,这两者是冲突的,所以要添加元数据锁;意向锁,比如对表中某一行加锁了,我们就对表插入一个意向共享锁,用来标识表里面的行是否加锁了,这时就不需要全表扫描了,直接读标记就能知道是否加锁了;auto-inc锁是往表中插入insert数据的时候会使用,与行级锁的区别是不需要commit或rollback才释放锁,而是insert插入后马上释放锁;
行级锁分为记录锁,间隙锁,临键锁;
记录锁分为S锁(共享锁),X锁(排他锁);
间隙锁是用来解决幻读问题的;幻读即两个select得到的数据集不一样;
临键锁是记录锁和间隙锁的综合;
死锁
插入意向锁为了提高插入的性能,为了使多条插入互不干扰,我们使用插入意向锁;