Spring事务的隔离级别和事务的传播机制

Spring事务的隔离级别​

1.ISOLATION_DEFAULT:这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应。 2.ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。 3.ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。 4.ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。 5.ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读​

事务的传播行为,默认值为 Propagation.REQUIRED。可以手动指定其他的事务传播行为,如下:​

Propagation.REQUIRED(默认的事务传播级别) 如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。

Propagation.SUPPORTS 如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。

Propagation.MANDATORY 如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。

Propagation.REQUIRES_NEW 重新创建一个新的事务,如果当前存在事务,延缓当前的事务。

Propagation.NOT_SUPPORTED 以非事务的方式运行,如果当前存在事务,暂停当前的事务。

Propagation.NEVER 以非事务的方式运行,如果当前存在事务,则抛出异常。

Propagation.NESTED 如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。

Propagation.REQUIRED, Propagation.REQUIRES_NEW是最常用的两张事务传播行为

​事务失效的原因:​

1.事务方法访问修饰符非public

解决方法:修改修饰符为public

2.在方法中自身(this)调用的话可能会失效

解决方法: 自己注入自己,用注入的实例调用或者新建一个类去调用

3.数据库本身不支持事务

解决方法:修改事务

4.@Transational注解方法抛出的异常不是spring事务支持的异常,导致事务失效

解决方法:1.指定spring支持的事务类型

2.抛出RuntimeException运行时异常或者spring事务支持的异常

5.@Transational注解所在的类没有被spring管理,导致事务失效

解决方法:加上Service注解或使用其他能注册成spring Bean的方式或注解

5.catch掉异常之后,没有再次抛出事务异常,导致事务失效

解决方法:捕获异常后再次抛出

6.数据源没有配置事务管理器,导致事务失效

7.传播类型不支持事务,导致事务失效

8.多线程调用,导致事务失效

你可能感兴趣的:(spring,java,数据库)