Spring—java注解配置事务

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();
    }

结果:

有异常程序报错,数据库的数据未发生变化。
在这里插入图片描述

发布了25 篇原创文章 · 获赞 0 · 访问量 285

猜你喜欢

转载自blog.csdn.net/qq_42219004/article/details/105204165