对事务的了解仅停留在于一个@Transactional注解 ?

当我们往数据库存入数据时,存到一般突然出了个异常,此时我们就需要回滚数据,让之前插入的数据清除掉,这就是事务的作用。

在我们写一个springboot / spring 项目时,经常在方法或类上加一个@Transactional注解,一般是用在service层,目的就是对数据进行一定的数据管理,下面我们就具体看一下@Transactional 下的一些属性。

 

事务的传播行为(propagation):他的默认值是REQUIRED,就是一定会有事务给其添加,对于增删改我们可以使用他,对于查找我们可以使用SUPPORTS。

  @Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
  @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务
  @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
  @Transactional(propagation=Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常
  @Transactional(propagation=Propagation.NEVER) :必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
  @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务

read-only:该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。一般情况下我们对于查找设置为true,其他情况为false

 

事务的隔离级别(isolation ):默认值是DEFAULT

  @Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用
  @Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读)
  @Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)
  @Transactional(isolation = Isolation.SERIALIZABLE):串行化

补充:

更新丢失

两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。

脏读

一个事务读取到了另一个事务未提交的数据操作结果。这是相当危险的,因为很可能所有的操作都被回滚

不可重复读

不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。

包括以下情况:

(1) 虚读:事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。

(2) 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。

 

rollback-for:指定产生什么异常时进行回滚

      指定单一异常类:@Transactional(rollbackFor=RuntimeException.class) 当抛RuntimeException异常时进行回滚

      指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

 

timeout:用于指定事务的超时时间,默认值为-1,表示永不超时,如果定义了数值,以秒为单位

 @Transactional(propagation = Propagation.NOT_SUPPORTED ,readOnly = true,isolation = Isolation.DEFAULT,timeout = -1,rollbackFor = Exception.class)

        public List getAll() {
            return null;
        }

 

你可能感兴趣的:(springboot,spring)