Spring—java注解配置事务
银行转账是一个比较经典的场景,假设张三向李四转100元钱,可是途中银行系统突然断电了,常理来说张三的钱应该没有变。可是按照程序的执行情况,张三只有90元,而李四却还是只有100,就出现了一个比较严重的问题,这时事务的重要性不言而喻。
创建一个maven工程,导入依赖,注意依赖的版本一定要一致,否在将会发生错误。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.5.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
数据库表:
CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`money` int(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
创建配置类:
JdbcConfig.java
@EnableTransactionManagement //等同于xml配置中的 <tx:annotation-driven/>
@Configuration
@ComponentScan(basePackages = "org.youyuan")
public class JdbcConfig {
@Bean
DataSource dataSource(){
//DruidDataSource build = DruidDataSourceBuilder.create().build();
DruidDataSource build = new DruidDataSource();
//DriverManagerDataSource build = new DriverManagerDataSource();
build.setUsername("root");
build.setPassword("root");
build.setUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=UTC");
build.setDriverClassName("com.mysql.cj.jdbc.Driver");
return build;
}
@Bean
JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(dataSource());
}
// 配置事务管理器 注入连接池
@Bean
DataSourceTransactionManager dataSourceTransactionManager(){
return new DataSourceTransactionManager(dataSource());
}
}
AccountDao.java
@Repository
@Transactional //也可加在方法上
public class AccountDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void addMoney(String username, Integer money) {
System.out.println(this.jdbcTemplate);
jdbcTemplate.update("update account set money=money+? where name=?", money, username);
}
public void minMoney(String username, Integer money) {
jdbcTemplate.update("update account set money=money-? where name=?", money, username);
}
}
AccountService.java
@Service
public class AccountService {
@Autowired
AccountDao accountDao;
public void updateMoney(){
accountDao.addMoney("zs",10);
int a = 1/0;//异常
accountDao.minMoney("ls",10);
}
}
添加测试:
public class TransactionTest {
@Autowired
private AccountService accountService;
@BeforeEach
public void test(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JdbcConfig.class);
accountService=context.getBean(AccountService.class);
}
@Test
public void accountTest(){
accountService.updateMoney();
}
结果:
有异常程序报错,数据库的数据未发生变化。