mysql事务

1.事务简介

1)mysql中只有innodb数据库引擎才支持事务
2)事务保证了数据库的完整性,可以使批量的sql语句要么全部执行,要么全部不执行。

2.事务的四大特性

ACID:原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

原子性:

一个事务中的所有操作要么全部完成要么全部不完成,不会结束在中间的某个环节,即:在事务中间执行出现错误所有全部回滚,就类似该操作从未执行过一样。

一致性:

事务操作前后,数据库的完整性没有被破坏,例如:你向我转钱,不能出现你扣了钱,而我还没有收到。
隔离有四种级别:(1)读未提交;(2)读已提交;(3)可重复读;(4)串行化。

隔离性:

同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有干扰。例如:我再从一张银行卡中取钱,而在我取钱结束前,你不能往我卡里转钱

持久性:

事务结束后,对数据库的修改是永久的,即便系统故障了也不会丢失。

3.事务并发问题

1)脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2)不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3)幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

隔离级别与之对应的情况(mysql默认的事务隔离级别为repeatable-read)

隔离级别是否发生脏读是否不可重复读是否幻读
读未提交(read-uncommitted)
读已提交(read-committed)
可重复度(repeatable-read)
串行化(serializable)

脏读、幻读、不可重复读事例
需要开启与上表相对应的隔离级别
a.脏读:

执行顺序A事务B事务
1 开启事务  
2   开启事务
3   查询到余额为200
4 查询到余额为200  
5   取款100,余额被更改为100
6 查询账户余额为100  
7   取款发生错误事务回滚,余额变为200
8 查询余额为200  
9 提交事务  
说明 脏读即根据另一事务对数据的修改而变化  

b.不可重复读

执行顺序A事务B事务
1 开启事务  
2   开启事务
3   查询到余额为200
4 查询到余额为200  
5   取款100,余额被更改为100
6 查询账户余额为200  
7   提交事务
8 查询余额为100  
9 提交事务  
说明 不可重复读即可以读到另一事务提交后的数据  

c.不可重复读

执行顺序A事务B事务
1 开启事务  
2   开启事务
3   查询数据条数为10条
4 查询数据条数为10条  
5   新增十条数据
6   提交事务
7 查询数据条数为20条  
9 提交事务  
说明 幻读,前后多次读取数据总量不一致  
posted @ 2019-10-27 14:00  孤竹夜雨  阅读(102)  评论(0编辑  收藏  举报