mysql事务学习

1、什么是事务?

事务是一组原子性的SQL查询,或者说是一个独立的工作单元。对于事务内的语句,要么全部执行成功,要么全部失败。

2、事务的特点

总结下来就是四个特性原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)

2.1 原子性

一个事务必须最小的工作单元,整个事务中的操作要不全部成功,要不全部失败。不可能执行事务里面一部分操作。

2.2一致性

数据库总是从一个一致性状态到另一个一致性的状态。

2.3隔离性

通常来说,一个事务在未提交之前,对其他事务不可见。

2.4 持久性

一旦事务提交,对数据库的改变就会永久的保存到数据库中。

3 隔离级别

3.1 未提交读

事务中的修改,即使没有提交,对于其他事务也是可见的。事务可以读取未提交的数据,这种情况会导致脏读。

3.2 提交读

一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。也叫不可重复读,因为执行两次相同的查询,可能会得到不同的结果。

3.3 可重复读

保证了在同一事务中多次读取同样的记录结果是一致的。理论上会存在幻读的情况。什么是幻读呢,就是指当前事务在读取该范围的记录时,另一个事务又在该范围内插入了新的记录,当当前事务再次读取该范围的内容时,会产生幻行。InnoDB和XtraDB存储引擎通过多版本并发控制解决幻读问题。

3.4 可串行化

强制事务串行执行,会在读取的每一行数据上加锁。解决了幻读的问题。

4 死锁

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,产生的恶性循环的现象。 InnoDB的处理方法是将持有最少行级排他锁的事务回滚。

5 多版本并发控制(MVCC)

5.1 MVCC解释

MVCC是通过保存数据在某个时间点的快照来实现的,也就是说,不管执行多长时间,每个事务看到的数据都是一致的。
InnoDB的MVCC是通过在每行记录后面保存的两个隐藏列实现的,这两个列,一个保存了行的创建时间,一个保存了行的删除时间。当然存储的不是时间值,而是系统版本号。每当开启一个事务的时候,系统的版本号就会递增,事务开始时候的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号做比较。

5.2 MVCC具体操作

5.2.1 select

InnoDB只查找版本早于当前事务的数据行,这样保证事务读取的行,要么是事务开始之前已经存在,要么是事务自身插入或者修改的。
行的删除版本要么未定义,要么大于当前事务的版本号,这样就保证事务读取到的行,在事务开启之前未删除。

5.2.2 insert

InnoDB为新插入的每一行保存当前系统的版本号作为行版本号。

5.2.3 update

InnoDB为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统的版本号到原来行作为行删除标识。

5.2.4 delete

InnoDB为删除的每一行保存当前系统的版本号作为删除标识。

你可能感兴趣的:(mysql)