数据库事务的隔离级别有4个,由低到高依次为
Read uncommitted(未授权读取、读未提交)
Read committed(授权读取、读提交)
Repeatable read(可重复读取)
Serializable(序列化)
这四个级别可以逐个解决脏读、不可重复读、幻读
1、事务基本要素ACID
1.1 原子性
事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体
1.2 一致性
事务开始前和结束后,数据库的完整性约束没有被破坏
1.3 隔离性
同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
1.4 持久性
事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
2、事务的并发问题
2.1 脏读
事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2.2 不可重复读
事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
2.3 幻读
事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。
3、MySQL事务隔离级别
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。
Mysql的默认隔离级别就是Repeatable read。