栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring事务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring事务

Spring事务也算是面试中经常遇到的一个小知识点吧,关注的点有以下几个:

 下面简单写点案例,回顾一下;

一、通过配置文件来配置事务  1.导入jar包(这里直接导入了Spring boot相关jar)

    org.springframework.boot
    spring-boot-parent
    2.2.4.RELEASE



    
        org.springframework.boot
        spring-boot-starter-web
        2.2.4.RELEASE
    
    
        org.springframework.boot
        spring-boot-starter-jdbc
    
    
        mysql
        mysql-connector-java
    
    
        io.projectreactor
        reactor-core
        3.4.11
    
    
        aopalliance
        aopalliance
        1.0
    
    
        org.aspectj
        aspectjweaver
        1.8.13
    
    
        org.projectlombok
        lombok
        1.18.22
        provided
    

2.创建用户类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String userName;
    private int amount;
}
 3.创建service接口
public interface UserService {
    public User getUser(int id);
    public List getAllUser();
    public boolean delUser(int id);
    public boolean updUser(User user);
    public boolean insertUser(User user);
}
4.创建UserService接口实现类
public class UserServiceImpl implements UserService {

    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
        this.jdbcTemplate = jdbcTemplate;
    }

    public User getUser(int id) {
        return null;
    }
    public List getAllUser() {
        return null;
    }
    public boolean delUser(int id) {
        return false;
    }
    public boolean updUser(User user) {
        return false;
    }
    public boolean insertUser(User user) {
        int insert = jdbcTemplate.update("insert into user(user_name,amount) values(?,?)", "xiaowu", 100);
        int i = 1 / 0;
        return true;
    }
}
5.配置applicationContext.xml配置文件



    
    
        
        
        
        
    

    
        
    

    
    
        
    

    
    
        
        
            
            
            
            
        
    

    
    
        
        
    

    
    
        
    

    


6.测试
public class ApplicationStart {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = ctx.getBean(UserService.class);
        userService.insertUser(new User());
    }
}

 数据插入成功,日志及表数据如下:

修改UserServiceImpl代码如下:

public boolean insertUser(User user) {
    int insert = jdbcTemplate.update("insert into user(user_name,amount) values(?,?)", "xiaowu", 100);
    int i = 1 / 0;
    return true;
}

 再次测试,日志结果如下:

此时表里面也没有新数据插入,事务回滚。 

二、Springboot注解配置事务

1.创建application.properties,配置数据库连接;
spring.datasource.url=jdbc:mysql://localhost:3306/my_db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
 2.修改UserServiceImpl代码如下:
@Transactional(rollbackFor=Exception.class)
public boolean insertUser(User user) {
    int insert = jdbcTemplate.update("insert into user(user_name,amount) values(?,?)", "xiaowu", 100);
    return true;
}
 3.测试
@SpringBootApplication
@EnableTransactionManagement
public class ApplicationStart {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(ApplicationStart.class,args);
        UserService userService = (UserService) context.getBean("userService");
        userService.insertUser(new User());
    }
}

 数据插入成功;

 

 修改UserServiceImpl代码如下:

@Transactional(rollbackFor=Exception.class)
public boolean insertUser(User user) {
    int insert = jdbcTemplate.update("insert into user(user_name,amount) values(?,?)", "xiaowu", 100);
    int i = 1 / 0;
    return true;
}

再次运行,表里面未新增新数据,事务回滚:

 这里在简单测试一下其默认的事务传播机制,修改UserServiceImpl代码如下:

@Service("userService")
public class UserServiceImpl implements UserService {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private UserService userService2;
    @Transactional(rollbackFor=Exception.class)
    public boolean insertUser(User user) {
        int insert = jdbcTemplate.update("insert into user(user_name,amount) values(?,?)", "xiaolong", 1100);
        userService2.insertUser(new User());
        return true;
    }
    public User getUser(int id) {
        return null;
    }
    public List getAllUser() {
        return null;
    }
    public boolean delUser(int id) {
        return false;
    }
    public boolean updUser(User user) {
        return false;
    }
}

拷贝一份UserServiceImpl,改名为UserServiceImpl2

@Service("userService2")
public class UserServiceImpl2 implements UserService {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Transactional(rollbackFor=Exception.class,propagation= Propagation.REQUIRED)
    public boolean insertUser(User user) {
        int insert = jdbcTemplate.update("insert into user(user_name,amount) values(?,?)", "xiaoqian", 1200);
        int i = 1 / 0;
        return true;
    }
    public User getUser(int id) {
        return null;
    }
    public List getAllUser() {
        return null;
    }
    public boolean delUser(int id) {
        return false;
    }
    public boolean updUser(User user) {
        return false;
    }
}

 运行程序,数据未成功插入,将int i = 1/0;拷贝道UserServiceImpl中

    @Transactional(rollbackFor=Exception.class)
    public boolean insertUser(User user) {
        int insert = jdbcTemplate.update("insert into user(user_name,amount) values(?,?)", "xiaolong", 1100);
        userService2.insertUser(new User());
        int i = 1 / 0;
        return true;
    }

运行效果一样,数据也未插入表中;其它场景也很简单,这里就不做测试了;

总结:Spring事务相对简单,平时写些demo即可,官网里面有一个调用流程的视图,可以简单看看

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/357982.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号