03_事务隔离
03_事务隔离
事务隔离
事务需要保证一组数据库操作,要么全部成功,要么全部失败;
MySQL事务隔离性是保证数据一致性和并发控制的重要手段之一,它对于多个事务同时访问和修改同一数据的情况下,能够保证事务之间的独立性和隔离性,避免数据的不一致和冲突。
ACID是MySQL事务的四个特性,其中隔离性是指多个并发事务之间相互隔离,互不干扰,每个事务仅能看到自己的修改,而不能看到其他事务的修改。
- ACID概念最早由IBM的研究员在20世纪80年代提出,主要是为了解决数据库并发控制和数据一致性的问题,并逐渐成为了数据库事务的标准特性。
- ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)
隔离级别
MySQL中有四种隔离级别,包括读未提交、读提交、可重复读和串行化。
- 读未提交(read uncommitted)
- 读提交(read committed)
- 可重复读(repeatable read)、
- 串行化(serializable )
其中,读未提交是最低的隔离级别,它允许一个事务读取另一个事务未提交的数据,可能会出现脏读、不可重复读和幻读的问题。
读提交是一个事务提交后才能被其他事务看到,避免了脏读的问题,但可能会出现不可重复读和幻读的问题。
可重复读是MySQL默认的隔离级别,它保证了在一个事务执行期间,读取的数据是一致的,不会出现脏读、不可重复读和幻读的问题。
串行化是最高的隔离级别,它通过加锁的方式保证了事务的串行执行,避免了所有并发问题,但会导致性能问题。
事务隔离的实现
MySQL的事务隔离性是通过多版本并发控制(MVCC)来实现的,它通过为每个事务创建一个独立的视图来保证事务之间的隔离性。
- 在可重复读隔离级别下,视图是在事务启动时创建的,整个事务存在期间都使用这个视图。
- 在读提交隔离级别下,视图是在每个SQL语句开始执行时创建的。
- 而在读未提交隔离级别下直接返回记录上的最新值,没有视图概念。
- 在串行化隔离级别下,直接用加锁的方式来避免并发访问。
同时,MySQL在实现MVCC时,每条记录在更新时都会同时记录一条回滚操作,同一条记录在系统中可以存在多个版本,回滚日志会在不需要的时候被删除。
最后,需要注意的是,长事务会导致系统里面存在很老的事务视图,这些事务可能会访问数据库里面的任何数据,导致大量占用存储空间,因此建议尽量避免使用长事务。
默认隔离级别
Oracle 数据库的默认隔离级别其实是:读提交;
MySQL 数据库的默认隔离级别是:可重复读。