当咱们往数据库存入数据时,存到通常忽然出了个异常,此时咱们就须要回滚数据,让以前插入的数据清除掉,这就是事务的做用。spring
在咱们写一个springboot / spring 项目时,常常在方法或类上加一个@Transactional注解,通常是用在service层,目的就是对数据进行必定的数据管理,下面咱们就具体看一下@Transactional 下的一些属性。数据库
事务的传播行为(propagation):他的默认值是REQUIRED,就是必定会有事务给其添加,对于增删改咱们可使用他,对于查找咱们可使用SUPPORTS。springboot
@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,其余状况为falsespa
事务的隔离级别(isolation ):默认值是DEFAULTcode
@Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读)
@Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)
@Transactional(isolation = Isolation.SERIALIZABLE):串行化事务
补充:get
更新丢失it
两个事务都同时更新一行数据,一个事务对数据的更新把另外一个事务对数据的更新覆盖了。这是由于系统没有执行任何的锁操做,所以并发事务并无被隔离开来。io
脏读
一个事务读取到了另外一个事务未提交的数据操做结果。这是至关危险的,由于极可能全部的操做都被回滚。
不可重复读
不可重复读(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; }