什么是事务?
事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。
一个完整的事务需要满足如下四个属性(ACID):
原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间的某个环节;事务在执行过程中发生错误会被回滚到事务开始前的状态
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏(其他三个属性正常,则一致性成立,它是其他三大属性因种下的果)
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致的数据的不一致。
事务的隔离分为不同级别,包括读未提交/读已提交/可重复读/串行化
持久性:事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失
隔离级别:
读未提交【Read Uncommitted】: 在该隔离级别,所有的事务都可以看到其他事务没有提交的
执行结果。(实际生产中不可能使用这种隔离级别的),但是相当于没有任何隔离性,也会有很多
并发问题,如脏读,幻读,不可重复读等,我们上面为了做实验方便,用的就是这个隔离性。

读提交【Read Committed】 :该隔离级别是大多数数据库的默认的隔离级别(不是 MySQL 默认
的)。它满足了隔离的简单定义:一个事务只能看到其他的已经提交的事务所做的改变。这种隔离
级别会引起不可重复读,即一个事务执行时,如果多次 select, 可能得到不同的结果。

可重复读【Repeatable Read】: 这是 MySQL 默认的隔离级别,它确保同一个事务,在执行
中,多次读取操作数据时,会看到同样的数据行。但是会有幻读问题。

串行化【Serializable】: 这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突,
从而解决了幻读的问题。它在每个读的数据行上面加上共享锁,。但是可能会导致超时和锁竞争
(这种隔离级别太极端,实际生产基本不使用)

– 脏读:一个事务读取到另一个事务未提交的修改数据。
– 不可重复读:一个事务内多次读取同一数据,结果因其他事务修改而不同(重点是修改和删除操作导致)。
– 幻读:一个事务内多次查询,结果集因其他事务新增记录而不同(重点是新增记录导致)。





