本文将通过操作实际Mysql表来演示Mysql的事务相关知识点,以及介绍四种事务隔离级别是如何处理并发事务问题,最后引出MVCC和锁。
一.Mysql支持事务的引擎InnoDB
在MySQL 5.1 及之前的版本,MyISAM是默认引擎,MyISAM提供的大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM并不支持事务以及行级锁。
于是在Mysql5.1版本之后,Mysql就将InnoDB作为默认引擎。InnoDB可以支持行锁和事务,非常适用于处理操作量大,复杂度高的数据,存在频繁写操作的场景。
1.比较MyISAM与InnoDB区别?
(1)存储结构上:
MyISAM:每个MyISAM在磁盘上存储成三个文件。分别为:表定义文件、数据文件、索引文件。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
(2)存储空间上:
MyISAM: MyISAM支持支持三种不同的存储格式:静态表、动态表、压缩表。
InnoDB: 需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
(3) 可移植性、备份及恢复
MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,对于数据量大的文件会很吃力。
(4)事务支持
MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
(5)表锁差异
MyISAM: 只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB: 支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。
(6)CRUD操作
MyISAM:执行大量的SELECT,MyISAM是更好的选择。
InnoDB:执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。
(7)外键
MyISAM:不支持
InnoDB:支持
可参考文章 https://segmentfault.com/a/1190000008227211
2.Mysql事务作用
- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert,update,delete 语句
二.事务ACID原则
一般情况下,事务需要满足ACID四个基本原则。
(1)原子性:Atomicity,又称不可分割性
一个事务中的所有操作要么全部完成,要么全部失败,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
(2)一致性:Consistency