SQL事务中为了事务的安全,有着事务隔离这么一个功能,你知道SQL中有几种事务隔离级别吗?它们又有什么原理呢?跟着小编一起来学习学习吧。
一、读未提交(Read UnCommited)
在这个事务内数据已经被修改过,但还没有提交,所以对其他事务都是可见的,其他事务可以读取到刚才那个修改数据没有提交的事务。这个我们就称之为 “脏读”。这种可能会导致很多问题出现,一般实际应用来说很少使用。
二、读已提交(Read Commited)
这个事务隔离级别是大多数数据库的默认事务隔离级别,除了MySQL。在一个修改的事务还没有提交事务时,对于其他事务的内操作都是不可见的。也就是说,一个事务只能看到已经提交事务的数据。这种方式我们就称之为“不可重复读”,因此读取的时候可能得到不同的结果。
三、可重复读(Repeatable Read)
这个级别完美解决了脏读的问题,它保证了在一个事务里数据库读取的数据记录是一致的,但是,理论上又会出现幻读的问题发生,如我们在读取某个访问记录时,另外一个事务突然插入数据了。这样就会导致之前的事务再次读取,就会产生幻行。
四、可串行化(Serializable)
强制事务进行串行化执行,读取的每一行都加锁,避免幻读现象产生可能导致锁的争夺和超时消耗,是事务隔离级别最大的一个,一般在实际的项目中很少用到。
并发控制
mysql 的大多数数据库事务存储引擎大多不是简单的行级锁,基于提高并发性考虑,一般采用多版本控制实现,不仅仅是mysql ,oracle也是如此,可以认为多版本并发控制是行级别锁的变种,大多情况下避免了加锁的操作,因此开销更低,大部分实现非阻塞的读操作,和写操作也只锁定必要的行。多版本并发控制通过保存数据在某个时间点的快照来实现的,也就是说,不管执行多长时间,每个事务看到的数据是一致的,根据事务的开始时间不同,每个事务对应同一张表,同一时刻可能看到的数据不一样。实现版本并发控制包括乐观并发控制和悲观并发控制。
InnoDB存储引擎是通过每一行记录后面保存两个隐藏的列来实现的,默认采用可重复读隔离级别。这两列,一列保存行的创建时间,另外一列保存行的过期时间,时间不是系统时间 而是系统版本号,每当开始一个事务系统版本号就会开始递增,事务开始的时刻的系统版本号作为事务的版本号,与用来查询到的每行记录的版本号进行做对比,在可重复读的隔离级别的下版本并发控制解决幻读的问题。
以上就是文章的全部内容了,你了解了吗?想要知道更多java常见问答知识,就来关注我们的网站了解吧。
推荐阅读: