1. 事务的特性
简称ACID
1.原子性(Atomicity):事务被视为一个不可分割的操作单元,要么全部执行成功,要么全部失败回滚,不存在部分执行的情况。
2.一致性(Consistency):指事务执行前后,数据状态都是一致的,不存在矛盾。如果执行后数据是矛盾的,事务就会回滚到执行前的状态(执行前是一致的)。
3.隔离性(Isolation):多个事务并发执行时,每个事务的操作应当与其他事务的操作相互隔离,使得每个事务感觉到自己是在独立地操作数据库。隔离性保证了并发执行的事务之间不会互相干扰。
4.持久性(Durability):一旦事务提交成功,其对数据库的改变应该是永久性的,即使在系统故障或重启之后也能够保持。
2. 事务的隔离级别
事务的隔离级别定义了一个事务对其他事务的影响程度
为了保证四大事务特性的隔离性才产生的隔离级别
SQL、SQL2标准定义了四种隔离级别:
1.读未提交(Read Uncommitted):最低级别的隔离级别,事务可以读取尚未提交的数据,可能会出现脏读、不可重复读和幻读的问题;一事务写时禁止其他事务写。
2.读已提交(Read Committed):只限制同一数据写事务禁止其它读写事务。解决”脏读”,以及”更新丢失”;一事务写时禁止其他事务读写。
3.可重复读(Repeatable Read):限制同一数据写事务禁止其他读写事务,读事务禁止其它写事务(允许读)。解决”不可重复读”,以及”更新丢失”和”脏读”;一事务写时禁止其他事务读写、一事务读时禁止其他事务写。
4.串行化(Serializable):限制所有读写事务都必须串行化实行。要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。
3. 脏读
含义:事务A读取到事务B修改但还未提交的数据后,事务A又回滚更新操作,导致事务B读到的是脏数据,就是未进行提交但是回滚的数据。
图文详解
事务A要向账户存入100万,修改后还未提交,发现操作有误还未进行回滚修改后提交,事务B就读取到了事务A未提交的数据就进行操作,导致最终写入数据库的是错误的数据。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0f44c4f4f8a79a12c2636c381fe6bc3e.png)
4.不可重复读
含义:事务A读取某个数据后,事务B对其做了修改,当事务A再次读该数据时得到与前一次不同的值。
图文详解
事务A读取了数据,事务B对数据进行修改后提交了事务,此时事务A 再去读取数据就是事务B已经提交后的数据,得到的是与上一次读取时不同的数据。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4936da0ed27b21f68c80cf1d63ed45d4.png)
5. 幻读
含义:事务A在按查询条件读取某个范围的数据时,事务B又在该范围内插入了新的满足条件的数据,当事务A再次按条件查询数据时,会产生新的满足条件的数据。
图文详解
事务A查询某一账户某一时间段的交易记录,还未进行提交时,事务B又为这个账户新增一条记录提交,导致事务A最终查询到的符合查询条件的数据发生了变化。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/df5c8a91052928d534c386eb7f8e58f3.png)
6. mysql5.7以后默认隔离级别
可重复读 Repeatable Read
解决了脏读,不可重复读的问题
7.Oracle的隔离级别
只有两种
默认的隔离级别是:读已提交 Read Committed
串行化 Serializable:存在不可重复读的问题