什么是事务?
事务提供一种机制,将某个业务逻辑涉及的所有操作纳入到一个不可分割的执行单元,事务只有在“组成事务的所有操作均正确执行的情况下”才能提交,也就是说明知要其中任一操作执行失败,都将导致整个事务的回滚。(要么什么都不做,要么做全套机制)
事务的ACID
ACID 指数据库事务正确执行的四个基本特性的缩写,
**A-> Atomicity 原子性 **:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
**C-> Consistency 一致性:**在事务开始之前和事务结束以后,数据库数据的一致性约束没有被破坏。如:现有完整性约束A+B=10,如果一个事务改变了A,那么必须得改变B,使得事务结束后依然满足A+B=10,否则事务失败。
**I-> Isolation 隔离性:**数据库允许多个并发事务同时对数据进行读写和修改,但如果一个事务要访问的数据正在被另一个事务修改,只要另一个事务未提交,它所访问的数据就不受未提交事务的影响。
**D-> Durability持久性:**事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
事务并发问题
1、脏读:事务B读取了事务A更新但未提交的数据,而事务A回滚了,则事务B产生了脏读,读的数据为脏数据
2、不可重复读:在事务A里,有多次查询,但在某次查询后,事务B修改了数据并提交,导致事务A后一次查询的数据和前一次不同。(主要是数据库修改操作带来的影响)
3、幻读:老P要去拉消费账单,先查了下,有ABCDE五项消费,准备打印,这时候他老婆在网上买了个包包,单子出来后有ABCDEF六项,见鬼了。。
事务隔离的4个级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
1 | 1 |
mysql默认是repeatable-read