在springboot中事务的传播行为和隔离级别都是在TransactionDefinition这个接口中定义的。
传播行为定义了7种,分别用0-6来表示:
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
传播行为一共有7种,共分为2类。
传播行为分为两种:分为支持事物的传播和不支持事物的传播
1)、支持事务:
2)、不支持事物
spring与数据库事务本质上是一样的,spring是将数据库的事务进行封装。如果数据库没有事务,spring的事务是无效的。事务简单的来说就是提交、回滚和关闭三个操作。spring对数据库事务的封装原理就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作。
隔离级别有4种:
int ISOLATION_DEFAULT = -1;//默认的隔离级别,使用数据库当前的隔离级别。会是后面四种隔离级别的其中一种
int ISOLATION_READ_UNCOMMITTED = 1;//读未提交;会有脏读,不可重复读,幻读发生
int ISOLATION_READ_COMMITTED = 2; //读已提交;会有不可重复读,幻读发生
int ISOLATION_REPEATABLE_READ = 4; //重复读;会有幻读出现
int ISOLATION_SERIALIZABLE = 8; //串行化
脏读(Dirty Reads):一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做“脏读”。
不可重复读(Non-Repeatable Reads):一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变或某些记录已经被删除了!这种现象就叫做“不可重复读”。
幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。
关于事务属性的默认值,对于springboot来说Transactional注解中定义的。我们可以在定义我们的事务的时候,根据实际需要修改这些属性值
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
@AliasFor("transactionManager")
String value() default "";
@AliasFor("value")
String transactionManager() default "";
String[] label() default {};
Propagation propagation() default Propagation.REQUIRED;//默认的传播行为
Isolation isolation() default Isolation.DEFAULT;//默认的隔离级别
int timeout() default -1;
String timeoutString() default "";
boolean readOnly() default false;
Class<? extends Throwable>[] rollbackFor() default {};
String[] rollbackForClassName() default {};
Class<? extends Throwable>[] noRollbackFor() default {};
String[] noRollbackForClassName() default {};
}