事务相关


ACID

 

1. 原子性(Atomicity)

视为不可分割的最小元,事的所有操作要全部提交成功,要全部失

 

可以用回日志(Undo Log)来实现,回日志记录着事行的修改操作,在回滚时反向修改操作即可。

 

2. 一致性(Consistency)

在事务执行前后都保持一致性状。在一致性状下,所有事务对同一个数果都是相同的。

 

3. 隔性(Isolation)

一个事的修改在最提交以前,是不可的。

 

4. 持久性(Durability)

一旦事提交,其所的修改将会永保存到数中。即使系统发生崩,事务执行的果也不能失。

 

统发生奔可以用重日志(Redo Log)实现持久性。与回日志记录逻辑修改不同,重日志记录的是数的物理修改。

 

离级别

 

未提交(READ UNCOMMITTED)

中的修改,即使没有提交,也是可的。

 

提交(READ COMMITTED)

一个事取已提交的事的修改。话说,一个事的修改在提交之前是不可的。

 

可重复读(REPEATABLE READ)

在同一个事中多次取同一数果是一的。

 

可串行化(SERIALIZABLE)

制事串行行,这样多个事互不干,不会出一致性问题

× × X

 

 

Mysql如何解决幻读问题?

Mysql的离级别是Repeatable read(可重复读),这种离级别下会生幻读问题,Mysql通过锁机制及多版本控制解决了幻读现象的生,主要手段如下:

 

快照

务每次取数候都会取建版本小于当前事版本的数,以及期版本大于当前版本的快照数。普通的 select 就是快照

行select操作是innodb行快照,会记录次select后的果,之后select 的候就会返回次快照的数,即使其他事提交了不会影当前select的数实现了可重复读了。

当前

在 InnoDB 中,认为 Repeatable 级别,InnoDB 中使用一被称 next-key locking 的策略来避免幻(phantom)象的生。

主要采用next-key,即行和gap来控制。

如select * from user where id =1 for update;

如果有id1的记录则会被加排(X),如果不存在,会加上next-key,此时插记录是会排出常的,以此解决幻读问题