什么是事务
一个最小的不可再分的工作单元,通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)
简单来说,就是A向B转账,A的钱减少了,B的钱增加了,这就是一个完整的事务。
事务的特性ACID
- 原子性(Atomicity):事务是不可再分的单元
- 一致性(Consistency):同一个事务里的SQL要么全部成功要么全部失败
- 隔离性(Isolation):事务A和事务B互相隔离,互不可见
- 持久性(Durability):事务的结束是把数据持久化到硬盘中
并发事务可能会导致的问题
- 脏读:脏读就是一个事务读取了另一个事务还没有提交的数据。
比如事务A是刘备向张飞转账,扣除刘备账户余额一个亿,事务B是张飞接受刘备的转账,张飞账户增加一个亿;但是事务A执行了转账语句,但是还没有提交事务,然后张飞发现自己银行账户多了一个亿,然后他兴奋的告诉刘备,“哥哥,我完成小目标啦!,我银行账户多了一个亿”,然后刘备发现张飞这厮已经有一个亿了,那还给他转钱干嘛,于是刘备回滚事务A【rollback】,张飞第二天查看账户,那一个亿又没了,这就是脏读。 - 不可重复读:不可重复读就是一个事务读取到了另一个事务提交的数据。
比如事务A是刘备闲来无事,查看自己账户余额,事务B是张飞得到刘备的允许,掌管刘备的银行卡,张飞出门消费;刘备第一次查看余额,还剩一个亿,很开心,这时张飞出门买了一车茅台,花了五千万。刘备下一次查看余额时,发现自己没有动账户,咋少了五千万捏。然后,张飞良心发现,觉得自己对不起哥哥,于是它去卖了个肾,赚到一个亿,这时刘备账户里有了1.5亿,刘备下一次查看余额,发现钱又变多了,但是刘备老了,不喜欢这样的大起大落,这就是不可重复读,指更新操作。 - 幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
比如事务A是刘备排兵布阵,清点人数,事务B是张飞招兵买马,扩充军队。刘备在清点人数的时候,张飞安排新兵蛋子加入阵列,于是刘备一会清点出五千人马,一会清点出八千人马,这就是幻读,指插入删除操作
事务隔离级别
- 读未提交:read uncommitted
- 读已提交:read committed
- 可重复读:repeatable read
- 串行化:serializable
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted | 可能 | 可能 | 可能 |
read committed | 不可能 | 可能 | 可能 |
repeatable read | 不可能 | 不可能 | 对于InnoDB引擎不可能 |
repeatable read | 不可能 | 不可能 | 不可能 |