1 事务的四大特性ACID
原子性:一个事务的操作要么全部完成,要么全部不完成
一致性:事务操作前和操作后,数据满足完整性约束,就是数据库的总数据是一样的
隔离性:多个事务使用相同数据时,不会相互干扰
持久性:事务处理结束后,对数据的修改是永久的
2 事务的实现原理
对于「读未提交」隔离级别的事务来说,因为可以读到未提交事务修改的数据,所以直接读取最新的数据就好了;
对于「串行化」隔离级别的事务来说,通过加读写锁的方式来避免并行访问;
对于「读提交」和「可重复读」隔离级别的事务来说,它们是通过 Read View 来实现的,它们的区别在于创建 Read View 的时机不同,大家可以把 Read View 理解成一个数据快照,就像相机拍照那样,定格某一时刻的风景。「读提交」隔离级别是在「每个语句执行前」都会重新生成一个 Read View,而「可重复读」隔离级别是「启动事务时」生成一个 Read View,然后整个事务期间都在用这个 Read View。
3 事务的隔离级别
读未提交(read uncommitted),指一个事务还没提交时,它做的变更就能被其他事务看到;
读提交(read committed),指一个事务提交之后,它做的变更才能被其他事务看到;
可重复读(repeatable read),指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQL InnoDB 引擎的默认隔离级别;
串行化(serializable );会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;
4 脏读、幻读、不可重复读
脏读:一个事务读到了另一个事务未提交的修改过的数据
不可重复读:在同一个事务内多次读取同一个数据,如果前后两次读到的数据不一样
幻读:在一个事务内多次查询某个符合条件的记录时,前后记录数量不一致