Spring注解 - TX 聲明式事務


環境搭建

  1. 導入maven依賴
<!--spring提供的數據庫操作工具-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>
<!--c3p0 數據庫連接池-->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.5</version>
</dependency>
<!--mysql連接器-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
</dependency>
  1. 配置數據庫相關信息
@Configuration
@ComponentScan("com.spring.tx")
public class TxConfig {
    /**
     * 配置數據源
     */
    @Bean
    public DataSource dataSource() throws PropertyVetoException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setUser("root");
        comboPooledDataSource.setPassword("root");
        comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
        comboPooledDataSource.setJdbcUrl("jdbc:mysql:///test");
        return comboPooledDataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
        //Spring對配置類做了特殊處理,多次調用給容器中加組件的方法,其實是從容器中找組件,並不會重新添加
        return new JdbcTemplate(dataSource());
    }
}
  1. 添加數據訪問層、業務層
@Repository
public class UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void saveUser(String name, Integer age) {
        String sql = "insert into user(name, age) values(?, ?)";
        jdbcTemplate.update(sql, name, age);
    }
}
@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    public void saveUser(){
        String name = "jack11";
        Integer age = 19;
        userDao.saveUser(name, age);
    }
}
  1. 添加測試類
public class TxTest {
    @Test
    public void test(){
        ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class);
        UserService userService = (UserService) context.getBean("userService");
        userService.saveUser();
    }
}

事務問題

此時基本環境已經搭建好了,點擊運行,數據可以成功插入但是還沒有配置事務,沒有事務回滾會造成某些情況下數據出錯。在Spring注解中,可以在需要添加事務的方法或類上加@Transactional,並且開啟事務管理功能,即@EnableTransactionManagement,代碼如下:

  1. 修改UserService 的 saveUser 方法
@Transactional
public void saveUser(){
    String name = "jack11";
    Integer age = 19;
    userDao.saveUser(name, age);
    //模擬異常
    int i = 1 / 0;
}
  1. 在配置類加上@EnableTransactionManagement
@Configuration
@ComponentScan("com.spring.tx")
@EnableTransactionManagement
public class TxConfig {
	//省略數據源、jdbcTemplate的配置
}

再次運行測試方法,會發現報錯了,但不是我們模擬的異常報錯,控制台提示找不到bean

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available

我們還需要注冊一個事務管理器來管理事務,PlatformTransactionManager有很多實現類,在Spring 中 JdbcTemplate、Mybatis應該使用 DataSourceTransactionManager

在配置類中再注冊一個組件,運行,事務生效

/**
 * 注冊事務管理器
 */
@Bean
public PlatformTransactionManager platformTransactionManager() throws PropertyVetoException {
    return new DataSourceTransactionManager(dataSource());
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM