数据库事务--springboot事务处理

news2024/11/10 12:14:10

二、简单事务使用 模拟一

1、数据库

db.sql

drop database  if exists  supermarket;
create database supermarket;
use supermarket;
drop table if exists `order_item`;
CREATE TABLE `order_item` (
  `item_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT   '订单ID',
  `order_no` varchar(64) NOT NULL COMMENT '订单号',
  `user_id` bigint(20) NOT NULL COMMENT '用户ID',
  `goods_id` bigint(20) NOT NULL COMMENT '商品ID',
  `price` decimal(12,2) NOT NULL COMMENT '单价',
  `count` int(11) NOT NULL COMMENT '数量',
  PRIMARY KEY (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '订单项表';


drop table if exists `good_stock` ;
CREATE TABLE `good_stock` (
  `stock_id` bigint(20) NOT NULL AUTO_INCREMENT  COMMENT '库存ID',
  `goods_id` bigint(20) NOT NULL COMMENT '商品ID',
  `total` int(11) NOT NULL COMMENT '总数量',
  `sold` int(11) NOT NULL COMMENT '已售出',
  PRIMARY KEY (`stock_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '商品库存表';

insert into  good_stock (goods_id,total,sold) values(100000,10,0);

student.sql

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  `sex` varchar(255) DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1004 DEFAULT CHARSET=utf8;



INSERT INTO `student` VALUES (1001,'张三','boy'),(1002,'李四','girl'),(1003,'王五','secret'),(1004,'hehe','female'),(1005,'hehe','female'),(1006,'hehe','female'),(1007,'hehe','female'),(1008,'hehe','female'),(1009,'hehe','female');

2、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.study</groupId>
    <artifactId>springboot-transactional</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-transactional</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2、实体类

src/main/java/com/study/springboottransactional/entity/Student.java

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Student {
    private int id;
    private String name;
    private String sex;
}

3、配置信息

src/main/resources/application.properties

#mysql的配置信息
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#支持SQL 输出
spring.jpa.show-sql=true
#format 一下 SQL 进行输出
spring.jpa.properties.hibernate.format_sql=true
#自动生成开启,让表数据会自动跟随entity类的变化而变化
spring.jpa.hibernate.ddl-auto=update
#开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。
mybatis.configuration.mapUnderscoreToCamelCase=true

4、接口

src/main/java/com/study/springboottransactional/repository/StudentRespository.java

@Repository
public interface StudentRespository {
    @Update(value = "insert into student(name,sex) " +
            "values(#{student.name},#{student.sex})")
    void insertStudent(@Param("student") Student student);

    @Select(value = "select * from student where id=(select @@IDENTITY)")
    Student findStudentByNear();
}

src/main/java/com/study/springboottransactional/service/StudentService.java

@Service
public class StudentService {
    @Autowired
    private StudentRespository studentRespository;

    public Student addStudent(String name,String sex){
        Student stu = Student.builder().name(name).sex(sex).build();
        studentRespository.insertStudent(stu);
        //模拟在数据库操作完成之后发生一个异常操作
//        int i = 1/0;
        return studentRespository.findStudentByNear();
    }
}

src/main/java/com/study/springboottransactional/controller/StudentController.java

@RestController  //直接返回数据
public class StudentController {
    @Autowired
    private StudentService studentService;
    @RequestMapping("stu/add")
    public Object addStudent(@Param("name") String name, @Param("sex") String sex){
        return studentService.addStudent(name, sex);
    }
}

src/main/java/com/study/springboottransactional/SpringbootTransactionalApplication.java

@MapperScan("com.study.springboottransactional.repository")
@SpringBootApplication
public class SpringbootTransactionalApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTransactionalApplication.class, args);
    }

}

5、未加入异常执行结果

127.0.0.1:8080/stu/add?name=lisi&sex= male

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IdqY9PXX-1690892178853)(003-springboot事务处理.assets/image-20211117214206597.png)]

5、加入异常

src/main/java/com/study/springboottransactional/service/StudentService.java

@Service
public class StudentService {
    @Autowired
    private StudentRespository studentRespository;

    public Student addStudent(String name,String sex){
        Student stu = Student.builder().name(name).sex(sex).build();
        studentRespository.insertStudent(stu);
        //模拟在数据库操作完成之后发生一个异常操作
        int i = 1/0;//加入 的异常
        return studentRespository.findStudentByNear();
    }
}

127.0.0.1:8080/stu/add?name=wangwu&sex= male

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8p9fc4QF-1690892178854)(003-springboot事务处理.assets/image-20211117214503479.png)]

查看一下数据库wangwu 是否插入数据库,发现插入了,就有问题

6、解决

加入@Transactional注解

@Service
@Transactional
public class StudentService {
    @Autowired
    private StudentRespository studentRespository;

    public Student addStudent(String name,String sex){
        Student stu = Student.builder().name(name).sex(sex).build();
        studentRespository.insertStudent(stu);
        //模拟在数据库操作完成之后发生一个异常操作
//        int i = 1/0;
        return studentRespository.findStudentByNear();
    }
}

删除wang五这条数据再次测试

127.0.0.1:8080/stu/add?name=wangwu&sex= male

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZfiaSdOG-1690892178855)(003-springboot事务处理.assets/image-20211117214846117.png)]

这次数据库中没有插入

三、@Transactional 注解讲解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IN4r5wGD-1690892178855)(003-springboot事务处理.assets/image-20230710204858012.png)]

1、@Transactional的属性

1.1、readOnly 只读

该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写, 默认值为false。 例如:
@Transactional(readOnly=true)

使用这个,就无法增删改,只能读取

@Service
@Transactional
public class StudentService {
    @Autowired
    private StudentRespository studentRespository;
		@Transactional(readOnly = true)
    public Student addStudent(String name,String sex){
        Student stu = Student.builder().name(name).sex(sex).build();
        studentRespository.insertStudent(stu);

        return studentRespository.findStudentByNear();
    }
}



127.0.0.1:8080/stu/add?name=wangwu&sex= male 报错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkrLQP6T-1690892178855)(003-springboot事务处理.assets/image-20230710205233319.png)]

127.0.0.1:8080/stu/findAl

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afSGK0gr-1690892178856)(003-springboot事务处理.assets/image-20230710205314478.png)]

1.2、rollbackFor 和 rollbackForClassName

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cKvowDWX-1690892178856)(003-springboot事务处理.assets/image-20211118112142926.png)]

出现某些异常,进行回滚

一般用rollbackFor

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cc7LE9Un-1690892178857)(003-springboot事务处理.assets/image-20211118112248881.png)]

出现某些异常,不进行回滚

一般用noRollbackFor

回滚是有默认值的,runtimeexception、和error

1.3、propagation

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zaR2zF1r-1690892178857)(003-springboot事务处理.assets/image-20211119103504077.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BC5wkh2T-1690892178857)(springboot事务处理.assets/image-20201207192749196.png)]

绝大部分都可以用这个事务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7be5JdOB-1690892178858)(../../../../../网易云/课程笔记/002-单节点系统/005-框架源码/001- Spring框架原理/006-spring事务管理.assets/image-20211117210418845.png)]

儿子干完 老爸再干活

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-41DnSaEx-1690892178858)(../../../../../网易云/课程笔记/002-单节点系统/005-框架源码/001- Spring框架原理/006-spring事务管理.assets/image-20211117210446720.png)]

依靠外人活着

1.4、timeout

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p2hK7MLX-1690892178859)(003-springboot事务处理.assets/image-20211119104204484.png)]

1.5、isolation

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FhAJ4iaV-1690892178859)(003-springboot事务处理.assets/image-20211119105644059.png)]

四、@Transactional中的属性propagation讲解

➢@Transactional(propagation=Propagation.REQUIRED) :如果有事务,那么加入事务,没有的话新建一个(默认情况
下)
➢@Transactional(propagation=Propagation.NOT_ SUPPORTED) :容器不为这个方法开启事务
➢@Transactional(propagation=Propagation.REQUIRES_ NEW):不管是否存在事务,都创建一个新的事 务,原来的挂
起新的执行完毕,继续执行老的事务
➢@Transactional(propagation=Propagation.MANDATORY): 必须在-一个已有的事务中执行,否则抛出异常
➢@Transactional(propagation=Propagation.NEVER) :必须在一个没有 的事务中执行,否则抛出异常(与
Propagation.MANDATORY相反)
➢@Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那
就用事务.如果其他bean没有声明事务,那就不用事务.

1、propagation.REQUIRED

@Transactional(propagation=Propagation.REQUIRED):

  • 当A方法调用B方法的时候

    • 如果A方法没有开启事务,因为此时B方法开启了事务,A方法就会默认开启事务

    • 如果运行的时候B方法发生异常回滚,A方法也会发生回滚

    • 平时使用使用最多的

2、propagation.REQUIRES_NEW

@Transactional(propagation=Propagation.REQUIRES_ NEW):

不管是否存在事务,都创建一个新的事务 ,原来的挂起,新的执行完毕,继续执行老的事务

如果案例中的改成REQUIRES_NEW,如果B方法产生异常回滚,如果A方法没有捕捉处理掉异常,A方法也会回滚

3、propagation. MANDATORY

@Transactional(propagation=Propagation.MANDATORY): 

必须在一个已有的事务中执行,否则抛出异常

4、其他属性使用很少

五、@Transactional中的属性propagation属性timeout

5.1、介绍的demo

➢设置事务的超时时间,单位秒:
➢属性解释:
当某个业务运行的时间超过你的预期时,可以使用
该属性来让该业务抛出异常并且强制回滚;

5.2、使用场景

比如银行业务中,当用户进行取现出票失败时,

可以使用该属性来强制结束业务,进行回滚,减少用户等待的时间。

好处是能告诉你 失败,不会让客户一直刷新界面

5.3、demo

六、propagation属性isolation

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mhz67oCH-1690892178859)(003-springboot事务处理.assets/image-20211120194717013.png)]

一般使用可重复读

七、实战中的应用

1、场景描述

在商城项目中,往往会存在这两张表:订单表和库存表,那么这两张表在很多业务中都是同时成功或失败的,比
如用户下单,退货等操作,所以我们需要将这两个操作放在一个事务中进行控制。

2、数据库

drop database  if exists  supermarket;
create database supermarket;
use supermarket;
drop table if exists `order_item`;
CREATE TABLE `order_item` (
  `item_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT   '订单ID',
  `order_no` varchar(64) NOT NULL COMMENT '订单号',
  `user_id` bigint(20) NOT NULL COMMENT '用户ID',
  `goods_id` bigint(20) NOT NULL COMMENT '商品ID',
  `price` decimal(12,2) NOT NULL COMMENT '单价',
  `count` int(11) NOT NULL COMMENT '数量',
  PRIMARY KEY (`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '订单项表';


drop table if exists `good_stock` ;
CREATE TABLE `good_stock` (
  `stock_id` bigint(20) NOT NULL AUTO_INCREMENT  COMMENT '库存ID',
  `goods_id` bigint(20) NOT NULL COMMENT '商品ID',
  `total` int(11) NOT NULL COMMENT '总数量',
  `sold` int(11) NOT NULL COMMENT '已售出',
  PRIMARY KEY (`stock_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '商品库存表';

insert into  good_stock (goods_id,total,sold) values(100000,10,0);

3、实体类

src/main/java/com/study/springboottransactional/entity/OrderItem.java

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderItem {
    //订单ID
    private Long itemId;
    //订单号
    private String orderNo;
    //用户ID
    private Long userId;
    //商品ID
    private Long goodsId;
    //单价
    private BigDecimal price;
    //数量
    private Integer count;
}

src/main/java/com/study/springboottransactional/entity/GoodStock.java

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GoodStock {
     //库存ID
    private Long stockId;
    //商品ID
    private Long goodsId;
    //总数量
    private Integer total;
    //已售出
    private Integer sold;
}

src/main/java/com/study/springboottransactional/repository/GoodStockRepository.java

@Repository
public interface GoodStockRepository{

    @Update("update good_stock set sold=sold+#{reduceCount} where goods_id =#{goodsId} and total>=sold+#{reduceCount};")
    int reduceStock(@Param("goodsId") long goodsId, @Param("reduceCount") int reduceCount);
}

src/main/java/com/study/springboottransactional/repository/OrderItemRepository.java

SpringBoot @Repository解析 - 简书 (jianshu.com)

@Repository
public interface OrderItemRepository{
    @Update(value = "insert into order_item(order_no,user_id,goods_id,price,count) " +
            "values(#{orderItem.orderNo},#{orderItem.userId},#{orderItem.goodsId},#{orderItem.price},#{orderItem.count})")
    void insertOrderItem(@Param("orderItem") OrderItem orderItem);

    @Select(value = "select * from order_item where item_id=(select @@IDENTITY)")
//    @Results({
//            @Result(property = "itemId", column = "item_id"),
//            @Result(property = "orderNo", column = "order_no"),
//            @Result(property = "userId",column = "user_id"),
//            @Result(property = "goodsId",column = "goods_id")
//    })
    OrderItem findOrderItemByNear();
}

src/main/java/com/study/springboottransactional/service/OrderService.java

@Service
public class OrderService {
    @Autowired
    private OrderItemRepository orderItemRepository;
    @Autowired
    private GoodStockRepository goodStockRepository;

    public OrderItem addOrder(long goodsId, long userId, int count){
        //创建订单
        OrderItem orderItem = OrderItem.builder().orderNo(UUID.randomUUID().toString().replace("-", "")).
                price(new BigDecimal(goodsId)).userId(userId).count(count).goodsId(goodsId).build();
        orderItemRepository.insertOrderItem(orderItem);
        //扣减库存
        int updateRows = goodStockRepository.reduceStock(goodsId, count);
        if(updateRows <= 0){
            throw new IllegalArgumentException("下单失败,库存不足!");
        }
//        if(true) {
//            throw new RuntimeException("手动抛出异常,但是不回滚");
//        }
        OrderItem orderItemByNear = orderItemRepository.findOrderItemByNear();
        return orderItemByNear;
    }
}

127.0.0.1:8080/add/order?goodsld= 00000&count= 1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pR1pG1b9-1690892178860)(003-springboot事务处理.assets/image-20230710211707659.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nv4Zyhtg-1690892178860)(003-springboot事务处理.assets/image-20230710211726169.png)]

库存表的数量是10,但是却卖了11件 ,total为库存数量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D1IyzJOm-1690892178860)(003-springboot事务处理.assets/image-20230710212009482.png)]

以下是卖出的数量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KL4CNR60-1690892178861)(003-springboot事务处理.assets/image-20230710211832856.png)]

@Service
public class OrderService {
    @Autowired
    private OrderItemRepository orderItemRepository;
    @Autowired
    private GoodStockRepository goodStockRepository;

    @Transactional
    public OrderItem addOrder(long goodsId, long userId, int count){
        //创建订单
        OrderItem orderItem = OrderItem.builder().orderNo(UUID.randomUUID().toString().replace("-", "")).
                price(new BigDecimal(goodsId)).userId(userId).count(count).goodsId(goodsId).build();
        orderItemRepository.insertOrderItem(orderItem);
        //扣减库存
        int updateRows = goodStockRepository.reduceStock(goodsId, count);
        if(updateRows <= 0){
            throw new IllegalArgumentException("下单失败,库存不足!");
        }
//        if(true) {
//            throw new RuntimeException("手动抛出异常,但是不回滚");
//        }
        OrderItem orderItemByNear = orderItemRepository.findOrderItemByNear();
        return orderItemByNear;
    }
}


可以@Transactional(noRollbackFor = RuntimeException.class)加上这个不回滚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/822076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 用户和权限

一、root 用户 root 用户(超级管理员) 无论是windows、Macos、Linux均采用多用户的管理模式进行权限管理。在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root (超级管理员)。 root用户拥有最大的系统操作权限&#xff0c;而普通用户在许多地方的权限是受限的。…

一文教你吃透Git工具

目录 Git简介 git的安装和配置 新建仓库 工作区域和文件状态 git reset回退版本 使用git diff比较差异 Git简介 git是一个免费开源的分布式版本控制系统&#xff0c;它使用一个特殊的叫做仓库的数据库来记录文件的变化&#xff0c;仓库中的每个文件都有一个完整的版本历史…

windows10 wifi情况下修改静态IP

1.鼠标右击网络选择属性 2.选择更改适配器设置 3.在WLAN&#xff0c;右击选择属性 4. 双击Internet 协议版本4(TCP/IPv4) 5. 启用“使用下面的IP地址” 6.输入目标IP地址&#xff0c;子网掩码&#xff0c;默认网关 我以192.167.1.2为例&#xff1a; 7.cmd中ipconfig查询验证…

【驱动开发day8作业】

作业1&#xff1a; 应用层代码 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/ioctl.h>int main(int…

P3855 [TJOI2008] Binary Land

[TJOI2008] Binary Land 题目背景 Binary Land是一款任天堂红白机上的经典游戏&#xff0c;讲述的是两只相爱的企鹅Gurin和Malon的故事。两只企鹅在一个封闭的迷宫中&#xff0c;你可以控制他们向上下左右四个方向移动。但是他们的移动有一个奇怪的规则&#xff0c;即如果你按…

【技术讨论】RF环境搭建手册

简要整理下环境搭建的步骤&#xff0c;以便快速、准确的搭建测试环境。 一、环境搭建 一、Python 2.7 1、 不要用Python3.6&#xff0c;很多库3.6中还没有&#xff0c;wxPython官方只支持Python 2。 2、 环境变量配置后需要重启才能生效。 3、 环境变量添加C:\Python27\Sc…

k8s概念-deployment

deployment用于部署无状态应用 Deployment集成了上线部署、滚动升级、创建副本、回滚等功能 Deployment里包含并使用了ReplicaSet Replicaset 通过改变Pod副本数量实现Pod的扩容和缩容 参考文档 https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/ …

go Channel

channel 单纯地将函数并发执行是没有意义的。函数与函数之间需要交换数据才能体现出并发执行函数的意义。 虽然可以使用共享内存进行数据交换&#xff0c;但是共享内存在不同的goroutine中很容易发生竞态问题。为了保证数据交换的准确性&#xff0c;必须使用互斥量对内存进行…

ptyhon——案例五:设定:list=[0,1,2,3,4,5] 列表,翻转列表

案例五&#xff1a;设定&#xff1a;list[0,1,2,3,4,5] 列表&#xff0c;翻转列表def Reverse(lst):return [ele for ele in reversed(lst)] #翻转列表 lst[0,1,2,3,4,5] print(Reverse(lst))

insert into select用法

文章目录 一、insert into select二、insert into select插入失败 本篇文章主要讲解insert into select 的用法&#xff0c;以及insert into select的坑或者注意事项。本篇文章中的sql基于mysql8.0进行讲解 一、insert into select 该语法常用于从另一张表查询数据插入到某表中…

hcip——BGP实验

要求 1.搭建toop 2.地址规划 路由器AS接口地址R11 loop0:1.1.1.1 24 loop1 : 192.168.1.1 24 g0/0/0 12.0.0.1 24 R22 64512 g0/0/0: 12.0.0.2 24 g/0/01: 172.16.0.2 19 g0/0/2: 172.16.96.2 19 R32 64512g0/0/0: 172.16.0.3 19 g0/0/1:1…

【LeetCode】88. 合并两个有序数组

这道题我总共想了三种解法。 1.将nums2中的元素依次放入nums1有效元素的后面&#xff0c;再总体进行排序。 import java.util.*; class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int j 0;for(int i m;i<mn;i){nums1[i] nums2[j];j;}Arrays…

【PostgreSQL】系列之 一 CentOS 7安装PGSQL15版本(一)

目录 一、何为PostgreSQL&#xff1f; 二、PostgreSQL安装 2.1安装依赖 2.2 执行安装 2.3 数据库初始化 2.4 配置环境变量 2.5 创建数据库 2.6 配置远程 2.7 测试远程 三、常用命令 四、用户创建和数据库权限 一、何为PostgreSQL&#xff1f; PostgreSQL是以加州大学…

2023.08.01 驱动开发day8

驱动层 #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/interrupt.h> #include <linux/fs.h> #include <linux/gpio.h> #include <linux/of_gpio.h>#…

【从零开始学习JAVA | 三十四篇】IO流

目录 前言&#xff1a; IO流介绍&#xff1a; IO流的常见方法&#xff1a; 1.字节流类&#xff1a; 2.字符流类&#xff1a; 总结&#xff1a; 前言&#xff1a; IO流就是存入和读取数据的解决方案&#xff0c;并且他是一个知识点很多的章节&#xff0c;因此我们关于IO流…

mysql--InnoDB存储引擎--逻辑结构、内存架构、磁盘架构

MySQL进阶篇 文章目录 1、逻辑结构2、架构2、1 内存架构2、2 磁盘架构 1、逻辑结构 InnoDB 逻辑存储单元主要分为&#xff1a;表空间、段、区、页。层级关系如下图&#xff1a; 2、架构 2、1 内存架构 内存架构由四个部分组成&#xff0c;缓存池&#xff08;Buffer Pool&…

Autosar通信入门系列05-聊聊一帧Can/CanFD报文发送时间?

本文框架 1. 概述2. 一帧CAN报文发送时间计算3. 一帧CanFD报文的传输时间计算3.1 标准CAN与CANFD两者间的区别3.2 CANFD报文传输时间计算 1. 概述 本篇我们一起看下一帧Can报文发送需要多长时间&#xff0c;下述文章里我们会首先计算下Can分别对应的字节数&#xff0c;再根据传…

泛微oa 二次开发指南(ecology)

目录标题 一、环境搭建&#xff08;一&#xff09;先下载安装泛微oa&#xff08;ecology&#xff09;&#xff08;二&#xff09;idea环境搭建二、官方文档三、开发规范&#xff08;里面有入门案例&#xff09;四、三方系统调用oa系统接口五、oa系统所有接口文档六、ecology的一…

EAP设备自动化控制:新能源行业智能化生产的重要工具

随着全球对可再生能源需求的不断增长&#xff0c;新能源行业如锂电池和光伏发电等得到了蓬勃发展。为了满足市场需求&#xff0c;新能源行业需要不断提高生产效率、降低生产成本、改善产品质量。在这个过程中&#xff0c;EAP设备自动化控制成为了新能源行业智能化生产的重要工具…

Redis 源码解析之通用双向链表(adlist)

概述 Redis源码中广泛使用 adlist(A generic doubly linked list)&#xff0c;作为一种通用的双向链表&#xff0c;用于简单的数据集合操作。adlist提供了基本的增删改查能力&#xff0c;并支持用户自定义深拷贝、释放和匹配操作来维护数据集合中的泛化数据 value。 adlist 的…