Spring事务简介:
业务层实际上是组合了若干数据层的功能,在业务层开事务可以保障调用的多个数据层操作处于同一个事务,同成功,同失败。
通过下面的接口实现(平台事务管理器)
里面实现了提交时共同提交,回滚时都会回滚。
Spring提供的最基本事务管理器实现类
可以在业务层开事务,内部使用jdbc的事务,适用于Spring整合mybatis时的事务管理
调用数据层的两个方法实现转账操作
提供一个给指定账户加钱的方法,一个给指定账户减钱的方法
配置数据库中的属性的setter和getter方法以及一个toString方法
public class MybatisConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();ssfb.setTypeAliasesPackage("org.example.domain");ssfb.setDataSource(dataSource);return ssfb;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("org.example.dao");return msc;}
}
public class JdbcConfig {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String userName;@Value("${jdbc.password}")private String password;@Beanpublic DataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}//配置事务管理器,mybatis使用的是jdbc事务// @Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource){DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(dataSource);return transactionManager;}
}
@Configuration
@ComponentScan("org.example")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class, MybatisConfig.class})
public class SpringConfig {}
测试结果如下
数据发生变化
假如在业务层操作时出现问题,如下会抛出一个异常
但是数据库里面的数据却有一个人的钱少了,这种情况是不允许的
Spring提供的事务就是用来做这种需要保证同成功同失败的操作的
@Transactional 表示开启事务
也可以写在类或者接口上表示该类或者改接口下的所有方法都开启事务
在jdbc.config中定义一个事务管理器的bean,这里需要提供对应的数据源,一个bean需要外部资源通过参数注入的方式
@Configuration
@ComponentScan("org.example")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class, MybatisConfig.class})
@EnableTransactionManagement //新的注解
public class SpringConfig {}
现在就可以在出现异常时保证童成功同失败了