一文读懂MySQL事务

一. 事务的标准特性(ACID)

1,原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元,事务的所有操作要么全部提交成功,要么全部失败回滚。

2,一致性(consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

3,隔离性(isolation):通常来说,一个事务所做的修改在最终提交之前,对其他事务时不可见的。

4,持久性(durability) :一旦事务提交,则其所做的修改就会永久保存在数据库中。

ACID靠什么保证的?

A 原子性由undo log日志保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sql

C 一致性由其他三大特性保证、程序代码要保证业务上的一致性

I 隔离性由MVCC+锁来保证

D 持久性由内存+redo log来保证,mysql修改数据同时在内存和redo log记录这次操作,宕机的时候可以从redo log恢复。

二. 隔离级别

1,READ UNCOMMITTED(未提交读):此级别事务中的修改,即使没有提交,对其他事务也是可见的。事务可以读取未提交的数据,也被称为脏读。

2,READ COMMITTED(提交读):一个事务提交之前,所做的修改对其他事务不可见;但这个事务开始时,能看见别的事务已提交的修改,从而导致两次同样的查询,可能得到不一样的结果,这个级别有时候也叫做不可重复读。不会出现脏读情况。

3,REPEATABLE READ(可重复读):该级别保证了同一个事务多次读取同样记录的结果是一致的。但可能会出现幻读问题,(幻读:指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生换行)。

4,SERIALIZABLE(可串行化):强制事务串行执行,避免了幻读问题,它会在读取的每一行数据上都加锁(施加读锁),会导致锁争用和超时的问题。

Posted in MySQL.

发表回复