springboot 聲明式事物

關於事務處理機制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值爲指定名稱則拋出異常,形成事務回滾

相關文章
相關標籤/搜索