数据库事务并发访问产生的问题及四种事务隔离级别
一、事务的基本要素(ACID)
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
二、事务隔离级别和各个级别的并发访问问题。
1、更新丢失(MySQL所有事务隔离级别在数据库层面上均可避免)
事务A对数据进行操作时,事务B也在对同一数据更新操作并完成了提交,然后事务A遇到异常进行回滚导致事务B的更新丢失。
2、脏读
一个事务读到另一个事务未提交的数据。
3、不可重复读
事务A在多次读取同一数据的过程中,事务B对数据进行更新并提交,导致事务A多次读取同一数据时结果不一致。
4、幻读
事务A读取若干行数据,事务B以插入或删除行的方式来修改事务A的结果集。
其中不可重复读与幻读比较相似,不可重复读侧重对同一数据的修改,幻读侧插入增或删除数据。
事务隔离级别越高,对性能的影响也越大。
![](https://img2018.cnblogs.com/blog/1225390/201903/1225390-20190304214748196-1904357719.png)
mysql默认是可重复读、oracle默认是已提交读。