springboot事务管理「终于解决」

springboot事务管理「终于解决」什么是事务?我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数据的并不可靠,需要在这种情况下进行回退。事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态。事务管理是Spring框架中最为常用的功能之一,我们在使用SpringBoot开发应用时,大.

大家好,欢迎来到IT知识分享网。

什么是事务?

我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行 的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成, 之前成功操作数据的并不可靠,需要在这种情况下进行回退。

事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就 回退到事务开始未进行操作的状态。

事务管理是Spring框架中最为常用的功能之一,我们在使用Spring Boot开发应用时,大部分情况下也都需要使用事务。

eg:A转账给B,A转出去正常,B接收异常—–就不可以成功,就需要回退到A没有转账的状态。

1.创建service/UserService

package com.cc.springboot.service;

import com.cc.springboot.entity.User;

public interface UserService {
    Boolean addUser(User user);
}

  定义了一个接口方法

2. 使用service,创建service/impl/UserServiceImple

springboot事务管理「终于解决」

package com.cc.springboot.service.impl;

import com.cc.springboot.dao.Repository;
import com.cc.springboot.entity.User;
import com.cc.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
//模拟事务管理


@Service
public class UserServiceImple implements UserService {

    @Autowired
    Repository repository;

    @Transactional  //当前方法开启事务管理
    @Override
    public Boolean addUser(User user) {
//        模拟转账:转出
         repository.save(new User("a","1"));
        repository.save(new User("aa","1"));
        repository.save(new User("aaa","1"));
        repository.save(new User("aaa","1"));
        repository.save(new User("aaaa","1"));


//        转入:模拟失败
        repository.save(new User("cccccc","1"));
        repository.save(new User("ccccccccc","1"));
         repository.save(user);
        return null;
    }
}

 注入的dao相当于数据库操作

 

 3.controller/UserController测试

package com.cc.springboot.controller;

import com.cc.springboot.dao.Repository;
import com.cc.springboot.entity.User;
import com.cc.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

@RestController
public class UserController {
   

    @Autowired
    UserService userService;
    @GetMapping("/user2")
    public User addUser2(User user){
        userService.addUser(user);
        return user;
    }
}

事务的步骤

1.在启动类上 ,使用 @EnableTransactionManagement 开启注解方式事务支持

2.在 Service层方法上添加 @Transactional 进行事务管理(不需要在表头,一般查看不需要事务)

3.如果使用 JPA 创建表则需要指定数据库引擎为 Innodb

配置文件中添加:database-platform: org.hibernate.dialect.MySQL57Dialect

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/jpa?serverTimezone=GMT%2B8
    driver-class-name: com.mysql.cj.jdbc.Driver


   #jpa相关配置
  jpa:
    hibernate:
      #会根据映射实体类自动创建或更新数据表
      ddl-auto: update
    #控制台打印sql语句
    show-sql: true
#    8指定如下方言: 创建的表类型是Innodb,才可以进行对事物的回滚。
    database-platform: org.hibernate.dialect.MySQL57Dialect

 

总结:

  entity———–》数据库表的字段(getter,setter,构造方法)

  dao———–》数据库操作(和数据库打交道,需要entity)

  service——–》事务管理(封装具体的业务,一个接口,定义方法)

  service-impl——》实现service(需要dao注入)

  controller——–》注入service,具体操作。(访问路径,怎样的增删改查) 

dao和service举例理解

dao封装了用户的增删改查。而业务上要求批量删除用户,Service就可以封装出一个批量删除用户的功能,但是实现只是循环调用dao的单个删除

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/25460.html

(0)
上一篇 2023-07-20 22:00
下一篇 2023-07-26 22:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信