springboot开发案例之开启声明式事务

springboot开发案例之开启声明式事务

springboot开启事务非常简单,因为springboot已经默认对mybatis、jdbc、jpa开启了事务。只需要使用注解@Transactional

准备阶段

需要的依赖

<dependency>
      <groupId>org.mybatis.spring.boot</groupId>
       <artifactId>mybatis-spring-boot-starter</artifactId>
       <version>1.3.0</version>
</dependency>

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
       <scope>runtime</scope>
</dependency>
<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.0.29</version>
</dependency>

创建数据库并初始化

-- create table `test`
# DROP TABLE `test` IF EXISTS
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `money` double DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES ('1', 'aaa', '1000');
INSERT INTO `test` VALUES ('2', 'bbb', '1000');
INSERT INTO `test` VALUES ('3', 'ccc', '1000');

配置数据源

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
mybatis.mapper-locations=classpath*:mybatis/*Mapper.xml
mybatis.type-aliases-package=com.forezp.entity

通过配置mybatis.mapper-locations来指明mapper的xml文件存放位置,mybatis.type-aliases-package来指明和数据库映射的实体的所在包。

创建实体类

public class Test {
    private int id ;
    private String name ;
    private double money;

    getter..
    setter..

  }

数据访问dao接口

public interface TestMapper {
   int update( @Param("money") double money, @Param("id") int  id);
}

mapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.forezp.dao.AccountMapper2">


    <update id="update">
        UPDATE test set money=#{money} WHERE id=#{id}
    </update>
</mapper>

service

@Service
public class TestService {

    @Autowired
    TestMapper testMapper;

    @Transactional
    public void transfer() throws RuntimeException{
        testMapper.update(90,1);//用户1向用户2转账10元
        int i=1/0;
       testMapper2.update(110,2);
    }
}

想法是:使用注解@Transactional声明事务,并设计一个转账方法,用户1向用户2转账10元(用户1减10元,用户2加10元)。
在用户1减10 之后,抛出异常,即用户2加10块钱不能执行。
当加注解@Transactional之后,两个人的钱都没有增减。
当不加@Transactional,用户1减了10,用户2没有增加,即没有操作用户2 的数据。
可见@Transactional注解开启了事物。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright bcfou.com.Some Rights Reserved.