1.MyISAM和InnoDB的区别
InnoDB:支持事务 支持外键,支持MVCC 支持行级锁,不支持全文索引
Myisam:不支持事务,不支持外键,不支持MVCC ,支持表级锁,支持全文索引
2.mysql事务的特性
原子性:事务是最小的执行单位,不可被分割,确保事务要么执行成功,要么执行失败
一致性:事务执行前后摆正数据的一致性,例如转账业务,无论事务是否执行成功,转账人和收账人的总金额不变
隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,你读你的,他读他的,我不知道你,你也不知道我
持久性:事务一旦执行成功,对数据库的影响是持久的。好比变性手术,一旦执行成功,对你的影响是持久的。
3.事务带来的问题
脏读:一个事务读取到了另一个事务还未提交的数据,好比你正要修改表格中的数据,这时
领导来查看表格,发现数据还未修改。
幻读:一个事务多次读取数据的数量,每次读取数据数量不一致。
不可重复读:一个事务多次读取同一数据,在这个事务还没读取完毕,另一个事务对这个数
据进行了修改,发生多次读取到的数据不一致。
4.事务的隔离级别
读未提交:最低的隔离级别,允许读取尚未提交的数据变更,会导致脏读、幻读或不可重复读。
读已提交:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可
能发生。
可重复读:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻
止脏读和不可重复读,但幻读仍有可能发生。
可串行化:最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务
之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读
MySQL 默认采用的 可重复读隔离级别 Oracle 默认采用的 读已提交隔离级别
5.mysql事务实现的原理
事务是基于重做日志文件(redo log)和回滚日志(undo log)实现的。
每提交一个事务必须先将该事务的所有日志写入到重做日志文件进行持久化,数据库就可以通过重做日志来保证事务的原子性和持久性。
每当有修改事务时,还会产生 undo log,如果需要回滚,则根据 undo log 的反向语句进行逻辑操作,比如 insert 一条记录就 delete 一条记录。undo log 主要实现数据库的一致性