Spring 做为风靡世界的Java 开源框架,发挥着举足轻重的作用。那你有没有想过, Spring 内部又是怎么样实现的事务呢?
而且 在 Spring 之中除了设置事务的「隔离级别」之外,还可以额外配置事务的「传播特性」。你要知道,传播特性里,有两个家伙比较特别,一个PROPAGATION_REQUIRES_NEW,还有一个是PROPAGATION_NESTED。你要知道,所谓的 REQUIRES_NEW,是会在方法级联调用的时候,会开启一个新的事务,同时挂起(suspend)当前事务;NESTED 代表的嵌套事务,则是在方法级联调用的时候,在嵌套事务内执行。
我们应该都知道,这些传播行为,是 Spring 独有的,和数据库没有一毛钱关系。那在底层 Spring 用了什么黑魔法吗?是怎么样做到挂起事务的,又是怎么样嵌套事务的呢?
咱们一起来揭秘。
毋庸置疑,数据的操作中,我们离不开事务。
银行的转帐操作中,我们相信如果一边扣款,那对方一定会收到,而不竹篮打水一场空
事务在很多场景中都发挥着关键作用。
咱们先以 MySQL 为例,来捋一捋数据库的事务,隔离级别。
然后再来看这些数据库的配置,特性,在 Spring 里是怎样做的事务对应的。
以及 Spring 所谓的传播特性,又是如何作用到数据库的事务的,怎样做到挂起事务,嵌套事务。
事务
事务是什么?
它是一级原子性的SQL操作,一个独立的工作单元。如果工作单元中的SQL语句执行成功,那会全部成功,一个失败就会全部回滚。
与数据库的事务同时为大众熟知的是ACID。即数据库的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。就像应用内为了线程之间的互斥,线程安全等,需要做大量的工作,数据库为了 ACID,也做了许多的工作。
隔离级别
SQL 的标准中定义了四种隔离级别,规定了哪些是事务之间可见的ÿ