Spring框架本身其实没有事务管理的具体实现,只是提供了一个PlatformTransactionManager接口,然后各大数据库厂商根据接口对事务进行具体的实现。首先我们需要搞明白为什么需要进行事务管理,如果没有事务会出现什么问题?我们带着问题来看事务是解决什么问题的,作为开发都知道如果没有事务管理那么我们在进行业务操作的时候就没法保证数据的一致性,可能会出现脏读,幻读和不可重复读三个问题,既然事务是解决这三个问题的那么我们就再看看事务是如何解决这三个问题的,开篇都说了Spring没有对事务进行实现只是定义了接口规范,那么事务的具体实现落到了数据库驱动这边,如果我们全部都严格遵守数据库事务的ACID四大特性,那么我们的程序想要高效运行那是不可能的,所以为了兼容高效Spring在定义接口的时候定义了事务的隔离级别,这样我们在开发的过程中可以根据自己的需要选择相应的隔离级别,这样即保证了事务又提高了程序的运行性能,岂不美哉。接下来我们来看看Spring事务管理器是如何定义事务的隔离级别
隔离级别 | 说明 |
---|---|
Isolation.Default | Spring默认隔离级别,即采用数据库的隔离级别 |
Isolation.Read_Uncommit | 事务未提交可读,会出现脏读 |
Isolation.Read_Commit | 不可脏读,但会出现幻读和不可重复读 |
Isolation.Repeatable_Read | 不可脏读,不可重复读,但会出现幻读 |
Isolation.Searializable | 严格按照数据库的事务的ACID四大特性 |
首先我们来看看什么是脏读?脏读指的是一个事务在执行完操作后还没提交时,另一个事务可以直接读取上一个事务还未提交的数据,举个列子,事务A需要将数据从15修改成18,那么事务B在事务A还未提交事务的时候可以直接读取18,按理在事务A未提交前事务B只能读取到的结果是15,但是现在读取到的结果是18,这就是所谓的脏读
何为幻读?幻读是指两个独立事务AB,事务A修改所有的记录,事务B插入一些数据,那么就会出现本该全部修改的数据竟然还存在未修改的记录,就好像产生幻觉似的。
何为不可重复读,不可重复读好理解即在一个事务内多次查询的结果竟然不一样。
既然搞清楚了这三个问题,那么就再对照上表看看这五种隔离级别分别解决的是这三种问题的哪种。
手打不易,随手点个小心心呗