spring事务
1、spring事务简介
- 事务的作用:在数据层保证一系列的数据库操作同成功同失败
- Spring事务作用:在数据层或业务层保障一系列的数据操作同成功同失败
1.1、转账案例:
-
业务层接口
/** * @author: anle * @date: 2023/04/09 10:38 * * 转账接口 **/ public interface AccountService { /* * out 转出方法 * in 转入方法 * money 金额 * * */ @Transactional public void transfer(String out,String in ,Double money); }
-
数据层接口:
/** * @author: anle * @date: 2023/04/09 10:42 **/ public interface AccountDao { @Update("update user_money set money =money+ #{money} where name = #{name}") void inMoney(@Param("name") String name,@Param("money") Double money ); @Update("update user_money set money = money - #{money} where name = #{name}") void outMoney(@Param("name") String name ,@Param("money") Double money); }
-
业务层实现类:
/** * @author: anle * @date: 2023/04/09 10:50 **/ @Service public class AccountServiceImpl implements AccountService { private AccountDao accountDao; @Autowired public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } @Override public void transfer(String out, String in, Double money) { accountDao.outMoney(out,money); //int i = 1/0; accountDao.inMoney(in,money); } }
-
jdbc配置类
/** * @Author: AnLe * @Date: 2023/03/31/9:46 */ public class jdbcConfig { //1、定义一个方法获得要管理的对象 //2、@Bean、表示当前方法的返回值是一个bean @Value("com.mysql.jdbc.Driver") private String driver; @Value("jdbc:mysql://localhost:3306/sping-stu") private String url; @Value("root") private String username; @Value("123456") private String password; @Bean public DataSource dataSource(){ DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(username); ds.setPassword(password); return ds; } @Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); transactionManager.setDataSource(dataSource); return transactionManager; } }
-
mybatis配置类
/** * @Author: AnLe * @Date: 2023/03/31/9:52 */ public class MybatisConfig { @Bean public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){ SqlSessionFactoryBean sfb = new SqlSessionFactoryBean(); sfb.setTypeAliasesPackage("com.anle.domain"); sfb.setDataSource(dataSource); return sfb; } @Bean public MapperScannerConfigurer mapperScannerConfigurer(){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.anle.dao"); return msc; } }
-
spring配置类
/** * @Author: AnLe * @Date: 2023/03/31/9:19 */ @Configuration @ComponentScan("com.anle") @PropertySource({"jdbc.properties"}) @Import({jdbcConfig.class,MybatisConfig.class}) @EnableTransactionManagement public class SpringConfig { }
-
实体类:
/** * @author: anle * @date: 2023/04/09 10:57 **/ public class Account { private int id; private String name; private Double money; //get 和set方法
-
jdbc数据源:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/sping-stu?serverTimezone=UTC jdbc.username=root jdbc.password=123456
-
测试类:
/** * @author: anle * @date: 2023/04/09 10:53 **/ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringConfig.class) public class MoneyTest { @Autowired private AccountService accountService; @Test public void testTransfer(){ accountService.transfer("张三","李四", 200d); } }
-
整体结构:
-
实现spring事务需要以下步骤:
-
在业务层接口上增加spring事务管理器
@Transactional public void transfer(String out,String in ,Double money); }
注意事项:spring注解事务增加到业务层接口中而不会增加到业务层实现类中,降低偶合
注解式事务开发可以增加到业务层方法上表示当前方法开启事务,也可以增加到接 口上表示当前接口所有方法开启事务。
2.设置事务管理器:
@Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); transactionManager.setDataSource(dataSource); return transactionManager; }
注意事项:事务管理要根据实现技术进行选择
mybatis框架使用jdbc事务
3.开启注解式事务驱动:
@EnableTransactionManagement public class SpringConfig { }
-
2、spring事务角色
-
事务管理员:发起事务方,在spring中通常指代业务层开启事务的方法
-
事务协调员:加入事务方,在spring中通常指代数据层方法,也可以是业务层方法
3、事务配置
- 事务中的常见配置
4、事务传播行为
2、spring事务角色
-
事务管理员:发起事务方,在spring中通常指代业务层开启事务的方法
-
事务协调员:加入事务方,在spring中通常指代数据层方法,也可以是业务层方法
[外链图片转存中…(img-nofPvO83-1684156086347)]
3、事务配置
- 事务中的常见配置
[外链图片转存中…(img-UriyVedn-1684156086348)]
4、事务传播行为
[外链图片转存中…(img-yIZCAaof-1684156086348)]