關於事務處理機制ACID,記一下spring
原子、一致、隔離、持久,顧名思義不解釋。springboot
spring提供的事務處理接口:platformtransactionmanager,事務管理框架,名字好大。app
使用@Transaction 註解聲明事務(能夠在類,也能夠在方法上(方法會覆蓋類上的註解屬性))框架
它的屬性比較重要,通常狀況下不須要設置,包括ide
propagationtion(聲明週期 默認REQUIRED 也就是說方法中調用其餘方法若是出現異常,A、B方法都不會提交事物而會進行回滾操做)this
isolation(隔離:默認DEFAULT 方法中即便調用其餘方法也會保持事物的完整性,且方法A修改的數據在未提交前方法B不會讀取到)spa
timeout:事物過時時間code
readOnly:只讀事物,默認falseorm
rollbackFor:某個異常致使回滾blog
noRollbackFor:某個異常不會致使回滾
spingboot 會根據數據訪問不一樣自動配置不一樣的訪問事物實現bean(下面是源碼)
@Bean @ConditionalOnMissingBean(PlatformTransactionManager.class) public DataSourceTransactionManager transactionManager(DataSourceProperties properties) { DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(this.dataSource); if (this.transactionManagerCustomizers != null) { this.transactionManagerCustomizers.customize(transactionManager); } return transactionManager; }
springboot 默認會自動配置事物處理接口
在使用過程當中只要加上transaction註解便可
接口類
package com.duoke.demo.service; import com.duoke.demo.bean.Person; public interface PersonService { Person savePersonWithRollBack(Person person); }
實現類
package com.duoke.demo.service.impl; import com.duoke.demo.bean.Person; import com.duoke.demo.service.IPersonRepository; import com.duoke.demo.service.PersonService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class PersonServiceImpl implements PersonService { @Autowired private IPersonRepository repository; @Transactional(rollbackFor = IllegalArgumentException.class) @Override public Person savePersonWithRollBack(Person person) { Person p = repository.save(person); if(person.getName().equals("王消費")){ throw new IllegalArgumentException("已存儲回滾"); } return p; } }
控制器
@RequestMapping("rollback") public Person transation(Person person){ person.setId("xxxx"); return personService.savePersonWithRollBack(person); }
訪問rollback,如name值爲指定名稱則拋出異常,形成事務回滾