1. 程式人生 > 程式設計 >Spring註解 TX宣告式事務實現過程解析

Spring註解 TX宣告式事務實現過程解析

環境搭建匯入

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>

配置資料庫相關資訊

@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());
  }
}

新增資料訪問層、業務層

@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);
  }
}

新增測試類

public class TxTest {
  @Test
  public void test(){
    ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class);
    UserService userService = (UserService) context.getBean("userService");
    userService.saveUser();
  }
}

事務問題

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

修改UserService 的 saveUser 方法

@Transactional
public void saveUser(){
  String name = "jack11";
  Integer age = 19;
  userDao.saveUser(name,age);
  //模擬異常
  int i = 1 / 0;
}

在配置類加上@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

Spring註解 TX宣告式事務實現過程解析

在配置類中再註冊一個元件,執行,事務生效

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。