SpringBoot事务注解@Transactional
SpringBoot提供了⾮常⽅便的事务操作,通过注解就可以实现事务的回滚,⾮常⽅便快捷,下⾯我们就说⼀下如何进⾏事务操作。
1. 事务说明
在Spring中,事务有两种实现⽅式,分别是编程式事务管理和声明式事务管理两种⽅式。
编程式事务管理:编程式事务管理使⽤TransactionTemplate或者直接使⽤底层的PlatformTransactionManager。对于编程式事务管
理,spring推荐使⽤TransactionTemplate。
声明式事务管理:建⽴在AOP之上的。其本质是对⽅法前后进⾏拦截,然后在⽬标⽅法开始之前创建或者加⼊⼀个事务,在执⾏完⽬标⽅法之后根据执⾏情况提交或者回滚事务。
声明式事务管理不需要⼊侵代码,通过@Transactional就可以进⾏事务操作,更快捷⽽且简单。推荐使⽤
2. 如何使⽤
在Mybatis中使⽤事务,⾮常简单,只需要在函数增加注解@Transactional,⽆需任何配置。我们通过在controller层增加事务例⼦看下:
@Autowired
OrderServiceorderService; //order操作的Service层
@ApiOperation(value = "增加OrderCustomer")
@RequestMapping(value = "", method = RequestMethod.POST)
@ResponseBody
@Transactional
public JsonBean<Order> insertOrder(@RequestParam(value = "order") String order) {
try {
//创建订单
Order order = orderService.Id(),is_company,fk_want_company_id);
return new JsonBean(SUCCESS, orderCustomer);
}springframework事务
catch (ErrorCodeException e)
{
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return new ErrorCode());
}
}
@Transactional可以作⽤于接⼝、接⼝⽅法、类以及类⽅法上。当作⽤于类上时,该类的所有 public ⽅法将都具有该类型的事务属性,同时,我们也可以在⽅法级别使⽤该标注来覆盖类级别的定义。因此可以在Service层和Controller层使⽤,上述例⼦我们在Controller层实现,我们模拟了⼀个订单提交的接⼝,其中JsonBean是统⼀返回错误码基类,ErrorCodeException是⾃定义异常。
1. 通过@Transactional,实现了事务操作。
2. Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。也就是默认对RuntimeException()异常或是其⼦类进⾏事务回
滚;checked异常,即Exception可try{}捕获的不会回滚,因此对于我们⾃定义异常,通过rollbackFor进⾏设定,后续会单独讲
3. 如果我们需要捕获异常后,同时进⾏回滚,通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进⾏⼿动回
滚操作。
4. 使⽤Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
设置回滚点,使⽤TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滚到savePoint。
3.常⽤配置
参数名称功能描述
readOnly该属性⽤于设置当前事务是否为只读事务,设置为true表⽰只读,false则表⽰可读写,默认值为false。例如:@Transactional(readOnly=true)
该属性⽤于设置需要进⾏回滚的异常类数组,当⽅法中抛出指定异常数组中的异常时,则进⾏事务回滚。例
rollbackFor如:指定单⼀异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
rollbackForClassName 该属性⽤于设置需要进⾏回滚的异常类名称数组,当⽅法中抛出指定异常名称数组中的异常时,则进⾏事务回滚。例如:指定单⼀异常类名称@Transactional(rollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})
noRollbackFor 该属性⽤于设置不需要进⾏回滚的异常类数组,当⽅法中抛出指定异常数组中的异常时,不进⾏事务回滚。例如:指定单⼀异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:
@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
noRollbackForClassName 该属性⽤于设置不需要进⾏回滚的异常类名称数组,当⽅法中抛出指定异常名称数组中的异常时,不进⾏事务回滚。例如:指定单⼀异常类名称:@Transactional(noRollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})
propagation该属性⽤于设置事务的传播⾏为。例如:
@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
isolation该属性⽤于设置底层数据库的事务隔离级别,事务隔离级别⽤于处理多事务并发的情况,通常使⽤数据库的默认隔离级别即可,基本不需要进⾏设置
timeout该属性⽤于设置事务的超时秒数,默认值为-1表⽰永不超时
参数名称功能描述
4. 事务属性
事务隔离级别
隔离级别是指若⼲个并发的事务之间的隔离程度。TransactionDefinition 接⼝中定义了五个表⽰隔离级别的常量:TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表⽰使⽤底层数据库的默认隔离级别。对⼤部分数据库⽽⾔,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表⽰⼀个事务可以读取另⼀个事务修改但还没有提交的数据。该级别不能防⽌脏读,不可重复读和幻读,因此很少使⽤该隔离级别。⽐如PostgreSQL实际上并没有此级别。TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表⽰⼀个事务只能读取另⼀个事务已经提交的数据。该级别可以防⽌脏读,这也是⼤多数情况下的推荐值。
TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表⽰⼀个事务在整个过程中可以多次重复执⾏某个查询,并且每次返回的记录都相同。该级别可以防⽌脏读和不可重复读。
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执⾏,这样事务之间就完全不可能产⽣⼲扰,也就是说,该级别可以防⽌脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会⽤到该级别。
事务传播⾏为
所谓事务的传播⾏为是指,如果在开始当前事务之前,⼀个事务上下⽂已经存在,此时有若⼲选项可以指定⼀个事务性⽅法的执⾏⾏为。在TransactionDefinition定义中包括了如下⼏个表⽰传播⾏为的常量:
TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加⼊该事务;如果当前没有事务,则创建⼀个新的事务。这是默认值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加⼊该事务;如果当前没有事务,则以⾮事务的⽅式继续运⾏。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起。TransactionDefinition.PROPAGATION_NEVER:以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常。
TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加⼊该事务;如果当前没有事务,则抛出异常。TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
事务超时
所谓事务超时,就是指⼀个事务所允许执⾏的最长时间,如果超过该时间限制但事务还没有完成,则⾃动回滚事务。在TransactionDefinition 中以 int 的值来表⽰超时时间,其单位是秒。
默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。
事务只读属性
只读事务⽤于客户代码只读但不修改数据的情形,只读事务⽤于特定情景下的优化,⽐如使⽤Hibernate的时候。
默认为读写事务。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论