Spring声明式事务管理(完全注解方式)
-
创建数据表
-
目录结构
-
配置类
package com.sun.Spring.Dao.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; @Configuration //配置类 //组件扫描 @ComponentScan(basePackages ="com.sun.Spring.Dao") //开启事务 @EnableTransactionManagement public class TxConfig { // 创建数据库连接池 @Bean public DruidDataSource getDruidDataSource(){ DruidDataSource dataSource=new DruidDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///数据库名"); dataSource.setUsername("用户名"); dataSource.setPassword("密码"); return dataSource; //返回值是DruidDataSource类型的 } // 创建JDBCTemplate对象 @Bean public JdbcTemplate getJdbcTemplate(DataSource dataSource){ // 到ioc容器中根据类型找到dataSource对象进行注入 JdbcTemplate jdbcTemplate=new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource); return jdbcTemplate; } // 配置事务管理器 @Bean public DataSourceTransactionManager getdataSourceTransactionManager(DataSource dataSource){ DataSourceTransactionManager TransactionManager=new DataSourceTransactionManager(); TransactionManager.setDataSource(dataSource); return TransactionManager; } }
-
UserDaoImpl.java 实现类
package com.sun.Spring.Dao.Dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @Repository public class UserDaoImpl implements UserDao { // 注入JDBCTemplate模板 模板已在配置文件中配置完成 @Autowired private JdbcTemplate jdbcTemplate; @Override public void addMoney() { String sql="update t_account set money=money+? where username=?"; int marry = jdbcTemplate.update(sql, 100, "mary"); System.out.println(marry); } @Override public void reduceMoney() { String sql="update t_account set money=money-? where username=?"; int lucy = jdbcTemplate.update(sql, 100, "lucy"); System.out.println(lucy); } }
-
UserService.java 实现转账
package com.sun.Spring.Dao.Service; import com.sun.Spring.Dao.Dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @Service public class UserService { // 注入Dao @Autowired private UserDao userDao; // 传播行为,隔离级别 @Transactional(timeout = -1,readOnly = false ,propagation=Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ) public void setMoney(){ // lucy少100 userDao.reduceMoney(); int a=100/0; // mary多一百 userDao.addMoney(); } }
注:第一步,开启事务。第二步,进行事务操作。第三步,如果没有发生异常,提交事务;如果发生异常,事务回滚。(数据表数据不会发生变化)-----事务包含的所有操作要么全部成功,要么全部失败回滚。
-
测试方法
// 完全注解开发 @Test public void test2(){ ApplicationContext context= new AnnotationConfigApplicationContext(TxConfig.class); UserService userService = context.getBean("userService", UserService.class); userService.setMoney(); } }