spring==注解事务问题以及xml事务的配置 Dear 丶 2021-09-22 08:16 309阅读 0赞 今天遇到一个spring注解事务问题、这里总结一下。 ## 一、注解写法 ## 1、只读、事务。 @Transactional(readOnly=true) public List<MaterielPosition> getMaterielPositionAllByOrderEntryIDSumCount(OrderEntry orderEntry) { orderEntry.setState(0);//设置未审核状态 return materielPositionDao.getMaterielPositionAllByOrderEntryIDSumCount(orderEntry); } 2、读写事务 @Transactional public List<MaterielPosition> setlOrderEntryByIDAndStartus(OrderEntry orderEntry) { return this.materielPositionDao.setlOrderEntryByIDAndStartus(orderEntry); } ## 二、对于注解的事务的传播行为、这里总结一下 ## PROPAGATION\_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务,就加入到这个事务中。这是最常见的选择。(默认) PROPAGATION\_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION\_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。 PROPAGATION\_REQUIRES\_NEW:新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION\_NOT\_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION\_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 PROPAGATION\_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION\_REQUIRED类似的操作。 注意:翻看源码、其实上边这些只是spring-tx中jar包的package org.springframework.transaction;包下的接口(TransactionDefinition接口)中的常量、比如: 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; ## 三、如何配置 ## @Transactional(propagation=Propagation.REQUIRED) public List<MaterielPosition> setlOrderEntryByIDAndStartus(OrderEntry orderEntry) { return this.materielPositionDao.setlOrderEntryByIDAndStartus(orderEntry); } ## 四、有哪几种传播(7个) ## @Transactional(propagation=Propagation.REQUIRED)(默认) @Transactional(propagation=Propagation.MANDATORY) @Transactional(propagation=Propagation.NESTED) @Transactional(propagation=Propagation.NEVER) @Transactional(propagation=Propagation.NOT\_SUPPORTED) @Transactional(propagation=Propagation.REQUIRES\_NEW) @Transactional(propagation=Propagation.SUPPORTS) ## 五、传播的写法四和行为常量二中的关联 ## 这里Propagation是一个枚举、翻看源码可以知道在spring-tx包下的package org.springframework.transaction.annotation;包中枚举写成: public enum Propagation { REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW), NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), NEVER(TransactionDefinition.PROPAGATION_NEVER), NESTED(TransactionDefinition.PROPAGATION_NESTED); private final int value; Propagation(int value) { this.value = value; } public int value() { return this.value; } } 这样就将写法和常量定义好了、只写REQUIRED这样的名称就可以了。 ## 六、一般在xml中的配置写法 ## ![Center][] 后期如果有需要在做部分修改 [Center]: /images/20210920/5b14dcb287b1406abf7f8d666dcc9ee2.png
还没有评论,来说两句吧...