欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

@Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解

 更新時(shí)間:2022年01月25日 11:53:20   作者:wuyuanshun  
這篇文章主要介紹了@Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

@Transactional注解報(bào)錯(cuò)之多數(shù)據(jù)源

如果在加上@Transactional注解之后報(bào)錯(cuò),先查看程序是否為多數(shù)據(jù)源,之前專(zhuān)門(mén)有一章講解springboot的多數(shù)據(jù)源實(shí)現(xiàn)。多數(shù)據(jù)源的情況下加事物注解,有可能會(huì)出現(xiàn)問(wèn)題,以下是解決方案。

1.在配置數(shù)據(jù)源的同時(shí)

一定到在其中一個(gè)配置上加上@Primary注解,其他的不要加。

package com.wys.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
/**
 * @program:  
 * @description: 數(shù)據(jù)庫(kù)配置1
 * @author: wys
 * @create: 2019-12-03 16:20
 **/
@Configuration
@MapperScan(basePackages = "com.wys.mapper.**", sqlSessionFactoryRef = "oneSqlSessionFactory")
public class OneDataSourceConfig {
    @Value("${spring.datasource.one.driver-class-name}")
    String driverClass;
    @Value("${spring.datasource.one.url}")
    String url;
    @Value("${spring.datasource.one.username}")
    String userName;
    @Value("${spring.datasource.one.password}")
    String passWord;
    @Primary
    @Bean(name = "oneDataSource")
    @ConfigurationProperties("spring.datasource.one")
    public DataSource masterDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(userName);
        dataSource.setPassword(passWord);
        return dataSource;
    }
    @Bean(name = "oneSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mybatis/mapper-postgre/*.xml"));        
        return sessionFactoryBean.getObject();
    }
    @Bean(name = "oneSqlSessionFactory")
    public SqlSessionTemplate sqlSessionFactoryTemplate(@Qualifier("oneSqlSessionFactory")SqlSessionFactory sqlSessionFactory ) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

2.一定要在需要使用事物注解的數(shù)據(jù)源配置里

加上創(chuàng)建事務(wù)管理器

package com.wys.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
/**
 * @program:  
 * @description: 數(shù)據(jù)庫(kù)配置1
 * @author: wys
 * @create: 2019-12-03 16:20
 **/
@Configuration
@MapperScan(basePackages = "com.wys.mapper.**", sqlSessionFactoryRef = "oneSqlSessionFactory")
public class OneDataSourceConfig {
    @Value("${spring.datasource.one.driver-class-name}")
    String driverClass;
    @Value("${spring.datasource.one.url}")
    String url;
    @Value("${spring.datasource.one.username}")
    String userName;
    @Value("${spring.datasource.one.password}")
    String passWord;
    @Primary
    @Bean(name = "oneDataSource")
    @ConfigurationProperties("spring.datasource.one")
    public DataSource masterDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(userName);
        dataSource.setPassword(passWord);
        return dataSource;
    }
    @Bean(name = "oneSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mybatis/mapper-postgre/*.xml"));        
        return sessionFactoryBean.getObject();
    }
    /
 // 創(chuàng)建事務(wù)管理器1
    @Bean(name = "oneManager1")
    public PlatformTransactionManager txManager(@Qualifier("oneDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
/////////////////////////
    @Bean(name = "oneSqlSessionFactory")
    public SqlSessionTemplate sqlSessionFactoryTemplate(@Qualifier("oneSqlSessionFactory")SqlSessionFactory sqlSessionFactory ) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

在需要加注解的地方加上transactionManager 配置即可。

@Transactional(transactionManager ="oneManager1",rollbackFor=Exception.class)

@Transactional 錯(cuò)誤使用的幾種場(chǎng)景

 
@RestController
public class AController { 
    @Autowired
    AService aService;
 
    // 回滾
    @GetMapping("direct")
    public void direct() {
        aService.testTransactional();
    }
 
    // 不回滾
    @GetMapping("indirect")
    public void indirect() {
        aService.testTransactionalIndirect();
    }
 
    // 不回滾
    @GetMapping("nonPublic")
    public void nonPublic() {
        aService.testTransactionalNonPublic();
    }
 
    // 不回滾
    @GetMapping("catchException")
    public void catchException() {
        aService.testTransactionalCatchException();
    }
 
    // 不回滾
    @GetMapping("sqlException")
    public void sqlException() throws SQLException {
        aService.testTransactionalSQLException();
    }
 
    // 回滾
    @GetMapping("sqlExceptionWithRollbackfor")
    public void sqlExceptionWithRollbackfor() throws SQLException {
        aService.testTransactionalSQLExceptionWithRollbackfor();
    }
}
@Service
public class AService { 
    @Autowired
    TestTableDAO testTableDAO;
 
    // 回滾
    @Transactional
    public void testTransactional() {
        ATestTable er = new ATestTable();
        er.setSummary("test");
        testTableDAO.save(er); 
        throw new RuntimeException("exception");
    }
 
    // 不回滾: 類(lèi)內(nèi)部方法調(diào)用本類(lèi)內(nèi)部的其他方法并不會(huì)引起事務(wù)行為,即使被調(diào)用方法使用@Transactional注解進(jìn)行修飾
    public void testTransactionalIndirect() {
        testTransactional();
    }
 
    // 不回滾: @Transaction注解只對(duì)方法名為pubic的才生效
    @Transactional
    void testTransactionalNonPublic() {
        ATestTable er = new ATestTable();
        er.setSummary("test");
        testTableDAO.save(er); 
        throw new RuntimeException("exception");
    }
 
    // 不回滾
    @Transactional
    public void testTransactionalCatchException() {
        ATestTable er = new ATestTable();
        er.setSummary("test");
        testTableDAO.save(er); 
        try {
            throw new RuntimeException("exception");
        } catch (Exception e) {
            System.out.println("catch");
        }
    }
 
    // 不回滾: @Transactional默認(rèn)情況下只回滾RuntimeException和Error
    @Transactional
    public void testTransactionalSQLException() throws SQLException {
        ATestTable er = new ATestTable();
        er.setSummary("test");
        testTableDAO.save(er); 
        throw new SQLException("exception");
    }
 
    // 回滾: 指定在 SQLException 異常發(fā)生時(shí)回滾
    @Transactional(rollbackFor = {
            SQLException.class
    })
    public void testTransactionalSQLExceptionWithRollbackfor() throws SQLException {
        ATestTable er = new ATestTable();
        er.setSummary("test");
        testTableDAO.save(er); 
        throw new SQLException("exception");
    }
}
@Repository
public interface TestTableDAO
        extends JpaRepository<ATestTable, Integer>, JpaSpecificationExecutor<ATestTable> { 
}
@Entity
@Data
@Table(name = "test")
public class ATestTable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    int id;
 
    @Column(name = "summary", length = 512)
    String summary;
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • RocketMQ中消費(fèi)者的消費(fèi)進(jìn)度管理

    RocketMQ中消費(fèi)者的消費(fèi)進(jìn)度管理

    這篇文章主要介紹了RocketMQ中消費(fèi)者的消費(fèi)進(jìn)度管理,業(yè)務(wù)實(shí)現(xiàn)消費(fèi)回調(diào)的時(shí)候,當(dāng)且僅當(dāng)此回調(diào)函數(shù)返回ConsumeConcurrentlyStatus.CONSUME_SUCCESS ,RocketMQ才會(huì)認(rèn)為這批消息(默認(rèn)是1條)是消費(fèi)完成的,需要的朋友可以參考下
    2023-10-10
  • Java IO文件后綴名過(guò)濾總結(jié)

    Java IO文件后綴名過(guò)濾總結(jié)

    本篇文章給大家詳細(xì)講述了Java IO文件后綴名過(guò)濾的相關(guān)知識(shí)點(diǎn),以及實(shí)例代碼分享,有需要的朋友跟著小編一起學(xué)習(xí)下。
    2018-02-02
  • Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法

    Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法

    這篇文章主要介紹了Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法,本文給出了4種方法,需要的朋友可以參考下
    2014-10-10
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單,雙向鏈表

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單,雙向鏈表

    這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-07-07
  • 利用Java發(fā)送郵件的實(shí)現(xiàn)代碼

    利用Java發(fā)送郵件的實(shí)現(xiàn)代碼

    這篇文章給大家分享了如何利用Java發(fā)送郵件,文章通過(guò)實(shí)例代碼介紹的很詳細(xì),有需要的可以參考借鑒。
    2016-08-08
  • mybatis的xml中使用@符號(hào)調(diào)用類(lèi)方法示例

    mybatis的xml中使用@符號(hào)調(diào)用類(lèi)方法示例

    這篇文章主要為大家介紹了mybatis的xml中使用@符號(hào)調(diào)用類(lèi)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • java基礎(chǔ)之Object類(lèi)

    java基礎(chǔ)之Object類(lèi)

    這篇文章主要介紹了java基礎(chǔ)之Object類(lèi) 的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • SpringBoot登錄用戶(hù)權(quán)限攔截器

    SpringBoot登錄用戶(hù)權(quán)限攔截器

    這篇文章主要介紹了SpringBoot登錄用戶(hù)權(quán)限攔截器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MyBatis關(guān)閉一級(jí)緩存的兩種方式(分注解和xml兩種方式)

    MyBatis關(guān)閉一級(jí)緩存的兩種方式(分注解和xml兩種方式)

    這篇文章主要介紹了MyBatis關(guān)閉一級(jí)緩存的兩種方式(分注解和xml兩種方式),mybatis默認(rèn)開(kāi)啟一級(jí)緩存,執(zhí)行2次相同sql,但是第一次查詢(xún)sql結(jié)果會(huì)加工處理這個(gè)時(shí)候需要關(guān)閉一級(jí)緩存,本文給大家詳細(xì)講解需要的朋友可以參考下
    2022-11-11
  • java簡(jiǎn)單工廠模式入門(mén)

    java簡(jiǎn)單工廠模式入門(mén)

    下面小編就為大家?guī)?lái)一篇java工廠模式入門(mén)文章。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-07-07

最新評(píng)論