spring注解开发-事务管理

    xiaoxiao2022-07-13  147

    使用注解完成spring的事务管理功能

    1、配置数据源、JdbcTemplate操作数据

    //配置数据源 @Bean public DataSource dataSource() throws PropertyVetoException { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(password); dataSource.setDriverClass(driver); dataSource.setJdbcUrl(url); return dataSource; } //配置JdbcTemplate @Bean public JdbcTemplate jdbcTemplate(/*从ioc容器中获取dataSource对象*/DataSource dataSource){ JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); return jdbcTemplate; }

    2、编写servlce将需要进行事务控制的方法上加上@Transactional注解

    @Service public class UserService { @Autowired UserDao userDao; @Transactional//表示当前方法是一个事务方法 public void insert(){ String username = UUID.randomUUID().toString().substring(1, 5); userDao.insert(username,18); System.out.println("插入完成"); //出现异常,测试事务是否开启成功 int i = 1/0; } }

    3、给配置类加上@EnableTransactionManagement注解,开启基于注解的事务管理功能

    @EnableTransactionManagement//开启基于注解的事务管理功能 @PropertySource("classpath:dbconfig/db.properties") @ComponentScan(value = {"com.it.tx"}) @Configuration public class TxConfig {

    4、配置事务管理器来控制事务

    //注册事务管理器 @Bean public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); return transactionManager; }

    5、测试

    1.添加方法执行之前数据库数据

    2.注释掉i=1/0,未出现错误时,添加成功

     

    3.打开异常,再次运行

    有数学异常,查看数据库

    数据回滚,事务控制成功

    源码: 

    配置类:

    @EnableTransactionManagement//开启基于注解的事务管理功能 @PropertySource("classpath:dbconfig/db.properties") @ComponentScan(value = {"com.it.tx"}) @Configuration public class TxConfig { @Value("${jdbc.user}") private String user; @Value("${jdbc.password}") private String password; @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; //配置数据源 @Bean public DataSource dataSource() throws PropertyVetoException { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(password); dataSource.setDriverClass(driver); dataSource.setJdbcUrl(url); return dataSource; } //配置JdbcTemplate @Bean public JdbcTemplate jdbcTemplate(/*从ioc容器中获取dataSource对象*/DataSource dataSource){ JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); return jdbcTemplate; } //注册事务管理器 @Bean public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); return transactionManager; } }

    Service类:

    @Service public class UserService { @Autowired UserDao userDao; @Transactional//表示当前方法是一个事务方法 public void insert(){ String username = UUID.randomUUID().toString().substring(1, 5); userDao.insert(username,18); System.out.println("插入完成"); //出现异常,测试事务是否开启成功 int i = 1/0; } }

    Dao:

    @Repository public class UserDao { @Autowired JdbcTemplate jdbcTemplate; public void insert(String username, int age){ String sql = "insert into tbl_user(username,age) values(?,?)"; jdbcTemplate.update(sql,username,age); } }

     

    最新回复(0)