前提摘要:MySql只有使用InnoDB 引擎时才支持事务,MyISAM 引擎不支持事务
存储引擎:存储引擎是MySql中特有的一个术语,其它数据库中没有,比如oracle中有,但是不叫这个名字。
存储引擎听着高端大气上档次,实际上存储引擎是一个表存储/组织数据的方式。不同的存储引擎,表存储数据的方式不同。
事务的基础知识点
- 只有DM语句(insert、delete、update)才会有事务这一说,其它语句和事务无关! ! !因为只有以上的三个语句是数据库表中数据进行增、删、改的。只要操作一旦涉及到数据的增、删、改,那么就一定要考虑安全问题。
- InnoDB存储引擎提供一组用来记录事务性活动的日志文件
- MySql默认开启自动提交
auto commit
,开启MySql的事务start transcation
可关闭自动提交,需要手动提交会回滚事务。 - 提交事务(commit):清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。提交事务标志着,事务的结束。并且是一种全部成功的结束。
- 回滚事务(rollback):将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件。回滚事务标志着,事务的结束。并且是一种全部失败的结束。
事务的特性
ACID:
- A(Atomicity)原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- C(Consistency)一致性:事务前后数据的完整性必须保持一致。
- I(Isolation)隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- D(Durability)持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变应该永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
MySql事务隔离级别
4个隔离级别,从低到高
1. 读未提交( read uncommitted)
描述:事务A可读取到事务B的未提交的数据;
存在问题:脏读
这种隔离级别一般都是理论上的,大多数的数据库隔离级别都是2档起步!
2. 读已提交( read committed)
描述:事务A只能读取到事务B的提交后的数据;
解决了脏读问题;
存在问题:不可重复读
这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实。oracle数据库默认的隔离级别是: read committed。
3. 可重复读(repeatable read)
描述:事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读。
存在问题:幻读
mysql中默认的事务隔离级别是:repeatable read。
4. 串行化(serializable)
事务最高隔离级别,效率最低,类似Java中使用synchronize进行线程同步,此处便是事务同步,将事务串行化执行。
事务并发问题
脏读
事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
不可重复读
事务 A 多次读取同一条数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致(不能重复读)。
举例,有事务T1、T2
T1:1、根据条件X查询一组数据;2、对该组的每条记录进行修改;3、根据条件X查询一组数据;
T2:1、插入满足条件X的一条记录;
当T2的步骤1在T1的步骤1之后执行,提交之后,T1的步骤3再次查询时,发现有一条记录没有被更改,这就是不可重复读。
不可重复读通常针对数据更新(UPDATE)操作来说的。
幻读
举例,有两个事务T1、T2
T1:1、查询主键id为1001的数据,结果为不存在;2、插入id为1001的数据;
T2:1、插入id为1001的数据;
当T2的步骤1在T1的步骤1之后执行,提交之后,T1的步骤2因为主键冲突将无法执行。就好比T1“见鬼”了,明明查询不存在但是插入失败。
幻读更针对于对数据插入(INSERT)操作和删除(DELETE)来说的。
不可重复读和幻读的区别
网上有很多幻读的例子,但是讲的都略微牵强,经笔者查阅和理解,不可重复的侧重于两次读的操作,即:读-读。而幻读侧重于:读-写。上述幻读的例子中,T1的步骤1不能支持其步骤2的进行。
小结
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read uncommitted) | 是 | 是 | 是 |
读已提交(read committed) | 否 | 是 | 是 |
可重复读(repeatable read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
隔离级别越高,越能保证数据的完整性和一致性,对并发性能的影响也越大。