SQL——事务

news2024/12/21 22:20:12

🎈 什么是事务

💧 概念

  事务是用于保证数据的一致性,它由一组相关的DML(增、删、改)语句,该组的DML语句要么全部成功,要么全部失败。使用事务可以确保数据库的一致性和完整性,避免数据出现异常或不一致的情况。

💧 特性

  在 SQL 中,事务是指一组数据库操作,它们被视为单个逻辑单元并必须全部成功或全部失败。如果其中任何一个操作失败,则整个事务都会被回滚到之前的状态,保证数据的一致性和完整性。每个事务都拥有以下四个特性(简称ACID):

  1. 原子性(Atomicity):事务应该被视为一个原子操作,即要么全部成功,要么全部失败。如果任何单个操作失败,整个事务将回滚并且不会对数据库产生任何影响。

  2. 一致性(Consistency):事务执行后,数据库应该保持一个一致性状态。一致性状态是由事务操作所指定的约束条件定义的,也就是说,事务所做的任何更改都必须遵守其定义的约束条件。

  3. 隔离性(Isolation):事务应该与其他并发执行的事务隔离开来,以确保事务间不会相互干扰。通过各种技术,如锁定机制和多版本并发控制(MVCC),可以实现高度的隔离性。

  4. 持久性(Durability):一旦事务提交,其更改就应该永久保存在数据库中,即使系统发生故障或电源被关闭也是如此。这通常通过将更改写入磁盘或其他非易失性存储介质来实现。

  总之,事务是在 SQL 中用于处理一组数据库操作的机制,其中的 ACID 特性确保了事务的原子性、一致性、隔离性和持久性,从而确保了数据的完整性和可靠性。
  在SQL中,可以使用BEGIN TRANSACTION 、COMMIT和ROLLBACK等关键字来控制事务。BEGIN TRANSACTION开始一个新的事务,COMMIT语句提交事务,ROLLBACK语句则是回滚事务。

💧 基本操作

🔥 事务的几个重要操作

  1. start transaction – 开始一个事务
  2. savapoint 保存点名 – 设置保存点
  3. rollback to 保存点名 – 回退事务到保存点
  4. rollback – 回退全部事务
  5. commit – 提交事务,所有操作全部生效,不能回退。

🔥 回退事务

  在回退事务前,要先了解下保存点(savepoint)。保存点是事务中的点,用于取消部分事务,当结束事务(commit)时会自动删除该事务所定义的所有保存点。
  当执行回退事务时,通过指定保存点可以回退到指定的点。

🔥 提交事务

  使用commit语句可以提交事务。当执行了commit语句后,会确认事务的变化、结束事务、删除保存点、释放锁、数据生效。当使用commit语句结束事务后,其他会话将可以查看事务变化后的数据。

🔥 事务注意事项

  1. 如果不开始事务,默认情况下,DML操作时自动提交的,不能回滚。

    INSERT INTO goods VALUES (1,'java开发',29.9,'编程类','图书馆');
    SELECT * FROM `goods` ;
    

    在这里插入图片描述

  2. 如果开始一个事务,没有创建保存点,可一致性rollback也就是默认回退到事务开始时的状态。

    -- 开启事务
    START TRANSACTION;
    -- 插入数据
    INSERT INTO goods VALUES (2,'C#开发',30.9,'编程类','图书馆');
    SELECT * FROM `goods` 
    

    在这里插入图片描述

    -- 回滚 直接回退到事务开始时的状态。
    ROLLBACK;
    SELECT * FROM `goods` 
    

    在这里插入图片描述

  3. 可以在事务中(未提交时),创建多个保存点。例:savepoint aaa;执行dml, savepoint bbb;

    START TRANSACTION;
    SAVEPOINT point_a;
    INSERT INTO goods VALUES (3,'C++开发',30.9,'编程类','图书馆');
    SELECT * FROM `goods` 
    

    在这里插入图片描述

    ROLLBACK TO point_a;
    

    在这里插入图片描述

  4. 可以在事务没有提交前,选择回退到某个保存点。

  5. mysql的事务机制需要innodb的存储引擎还可以使用,myisam不好使。

  6. 开始一个事务 start transaction,set autocommit=off;

💧 事务的隔离级别

  事务的隔离级别(Isolation Level)是指多个事务同时操作相同的数据时,系统要如何处理它们之间的相互影响和冲突的程度。目前,SQL标准定义了4种基本事务隔离级别。分别是:

  1. Read Uncommitted(未提交读):事务中的修改,即使没有提交,对其他事务也是可见的。
  2. Read Committed(提交读):一个事务只能看见已经提交的事务所做的修改。
  3. Repeatable Read(重复读):在同一事务中,查询同一个记录会返回相同的结果,即使在这个事务种其他地方已经修改过这个记录。
  4. Serialize(串行化):所有事务依次逐个执行,这样每个事务都感觉不到其他事务的存在。

  在不同的隔离级别具有不同的并发控制机制,隔离级别越高,并发性能越差,但是数据一致性性越高。而较低的隔离级别可以提高并发性能,但是可能导致脏读、不可重复读和幻读等问题。

  • 脏读(dirty read):当一个事务读取另一个事务尚未提交的改变(insert、update、delete)时,产生脏读。
  • 不可重复读(nonrepeatable read):同一个查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读。
  • 幻读(phantom read):同一个查询在同一事物中多次进行,由于其他提交事务所做的插入或删除操作,每次返回不同的结果集,此时返回幻读。

MYSQL隔离级别定义了事务于事务之间的隔离程度。

mysql隔离级别脏读不可重复读幻读加锁读
Read Uncommitted(未提交读)不加锁
Read Committed(提交读)不加锁
Repeatable Read(重复读)不加锁
Serializable(串行化)加锁

说明:✔表示可能出现。❌表示不会出现。

🔥 事务隔离级别演示

🌀 未提交读(Read Uncommitted)隔离级别演示

  1. 开启两个mysql的控制台。
    mysql -u root -p
    
  2. 查看当前mysql的隔离级别。
    select @@transaction_isolation;
    
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | REPEATABLE-READ         |
    +-------------------------+
    1 row in set (0.00 sec)
    
  3. 把其中一个控制台的控制台的隔离级别设置为 Read Uncommitted(未提交读)
    -- 修改隔离级别。
    set session transaction isolation level read uncommitted;
    
    在这里插入图片描述
  4. 表测试
    Repeatable Read级别窗口:
    -- 在级别为Repeatable Read的窗口创建表
    create table `account` (
    	id int,
    	'name' varchar(32),
    	money int
    );
    -- 创建事务。
    start transaction;
    -- 等`Read Uncommitted`级别窗口创建事务后,然后插入数据
    insert into account value(1,'ning',8000);
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning |  8000 |
    +------+------+-------+
    1 row in set (0.00 sec)
    
    Read Uncommitted级别窗口:
    -- 创建事务。
    start transaction;
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning |  8000 |
    +------+------+-------+
    1 row in set (0.00 sec)
    
      结果发现,即便开启了事务,在Read Uncommitted级别窗口依旧能查看到Repeatable Read的窗口的数据,这种结果就是脏读
    Repeatable Read级别窗口:
    -- 再修改数据
    update account set money=10000 where id=1;
    -- 提交事务
    commit;
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning | 10000 |
    +------+------+-------+
    1 row in set (0.00 sec)
    
    Read Uncommitted级别窗口:
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning | 10000 |
    +------+------+-------+
    1 row in set (0.00 sec)
    
      结果来看,在Repeatable Read的窗口执行插入修改操作并提交后,Read Uncommitted级别窗口依旧能看到变化,也就是影响了Read Uncommitted级别窗口对于这个表的读的操作,这种结果就是幻读和不可重复读。
      而正常的事务,我们应该查到的是事务开始前的数据(不会发生改变)不受到除本事务外的操作的影响,现在却能看到数据在发生改变,这就是因为事务的隔离等级较低,数据的一致性也较低。

🌀 提交读(Read Committed)隔离级别演示

  1. 开启两个mysql的控制台。
    mysql -u root -p
    
  2. 查看当前mysql的隔离级别。
    select @@transaction_isolation;
    
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | REPEATABLE-READ         |
    +-------------------------+
    1 row in set (0.00 sec)
    
  3. 把其中一个控制台的控制台的隔离级别设置为 Read Uncommitted(未提交读)
    -- 修改隔离级别。
    set session transaction isolation level read committed;
    
    在这里插入图片描述
  4. 表测试
    Repeatable Read级别窗口:
    -- 创建事务。
    start transaction;
    -- 等`Read Committed`级别窗口创建事务后,在account表插入数据
    insert into account value (3,'qing',5000);
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning |  8000 |
    |    2 | Ming | 10000 |
    |    3 | qing |  5000 |
    +------+------+-------+
    3 rows in set (0.00 sec)
    
    Read Committed级别窗口:
    -- 创建事务。
    start transaction;
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning |  8000 |
    |    2 | Ming | 10000 |
    +------+------+-------+
    2 rows in set (0.00 sec)
    
      结果发现,在Repeatable Read级别窗口插入数据,但未提交(commit)时,Read Committed级别窗口并不能看到数据变化,也就是没有发生脏读
    Repeatable Read级别窗口:
    -- 再修改数据
    update account set money=15000 where id=2;
    -- 提交事务
    commit;
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning |  8000 |
    |    2 | Ming | 15000 |
    |    3 | qing |  5000 |
    +------+------+-------+
    3 rows in set (0.00 sec)
    
    Read Committed级别窗口:
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning |  8000 |
    |    2 | Ming | 15000 |
    |    3 | qing |  5000 |
    +------+------+-------+
    3 rows in set (0.00 sec)
    
      结果来看,在Repeatable Read的窗口插入修改操作并提交后,Read Uncommitted级别窗口能看到数据变化,也就是影响了Read Uncommitted级别窗口对于这个表的读的操作,这种结果就是幻读不可重复读

🌀 重复读(Repeatable Read)隔离级别演示

  1. 开启两个mysql的控制台。

    mysql -u root -p
    
  2. 查看当前mysql的隔离级别。

    select @@transaction_isolation;
    
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | REPEATABLE-READ         |
    +-------------------------+
    1 row in set (0.00 sec)
    
  3. 确认两个窗口都是 重复读(Repeatable Read)隔离级别,不是则修改

    -- 修改隔离级别。
    set session transaction isolation level repeatable read;
    

    在这里插入图片描述

  4. 表测试
    Repeatable Read级别窗口A

    -- 创建事务。
    start transaction;
    -- 等B窗口创建事务后,在account表插入数据
    insert into account value (4,'tian',10000);
    -- 修改数据
    update account set money=8000 where id=1;
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning |  8000 |
    |    4 | tian | 10000 |
    +------+------+-------+
    2 rows in set (0.00 sec)
    

    Repeatable Read级别窗口B

    -- 创建事务。
    start transaction;
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning | 10000 |
    +------+------+-------+
    1 row in set (0.00 sec)
    

      结果发现,在窗口A插入数据,但未提交(commit)时,窗口B并不能看到数据变化,也就是没有发生脏读
    Repeatable Read级别窗口A

    -- 提交事务
    commit;
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning |  8000 |
    |    4 | tian | 10000 |
    +------+------+-------+
    2 rows in set (0.00 sec)
    

    Read Committed级别窗口B

    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning | 10000 |
    +------+------+-------+
    1 row in set (0.00 sec)
    

      结果来看,在窗口A执行插入修改操作并提交后,窗口B能依旧看不到数据变化,这种结果就是没有出现幻读不可重复读

🌀 串行化(Serializable)隔离级别演示

  1. 开启两个mysql的控制台。
    mysql -u root -p
    
  2. 查看当前mysql的隔离级别。
    select @@transaction_isolation;
    
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | REPEATABLE-READ         |
    +-------------------------+
    1 row in set (0.00 sec)
    
  3. 修改一个窗口隔离级别为串行化(Serializable)
    -- 修改隔离级别。
    set session transaction isolation level Serializable;
    
  4. 表测试
    Repeatable Read级别窗口A
    -- 创建事务。
    start transaction;
    -- 等B窗口创建事务后,在account表插入数据
    insert into account value (5,'369',12000);
    -- 修改数据
    update account set money=9000 where id=4;
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning |  8000 |
    |    4 | tian |  9000 |
    |    5 | 369  | 12000 |
    +------+------+-------+
    
    Serializable级别窗口B
    -- 创建事务。
    start transaction;
    -- 查询数据
    select * from account;
    -- 结果会发现程序卡在这里。
    
    在这里插入图片描述
      会发现B窗口执行操作时会卡住不执行,这是因为在执行事务期间,一个或多个资源被其他会话锁定。默认情况下,数据库会在卡住一段时间后提示ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction。这就是在一个事务中更新一条记录,但在这个事务还没有提交之前,另一个事务也想要更新同一行记录。那么这个请求就会导致锁等待,如果等待时间超过了系统设置的时间限制,则会出现“Lock wait timeout exceeded”的错误提示。这个错误通常意味着当前事务需要等待其他正在运行的事务释放锁定的资源。
    Repeatable Read级别窗口A
    -- 提交事务
    commit;
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning |  8000 |
    |    4 | tian |  9000 |
    |    5 | 369  | 12000 |
    +------+------+-------+
    3 rows in set (1.02 sec)
    
    Serializable级别窗口B
    -- 查询数据
    select * from account;
    -- 结果
    +------+------+-------+
    | id   | name | money |
    +------+------+-------+
    |    1 | ning |  8000 |
    |    4 | tian |  9000 |
    |    5 | 369  | 12000 |
    +------+------+-------+
    3 rows in set (1.02 sec)
    
      会发现,在B窗口执行查询语句卡住的时候,将A窗口的操作提交,B窗口会随之立刻执行查询语句,这是因为在串行化隔离级别下,所有的事务都是一个接一个地执行,不会有两个事务同时并发访问同一组数据的情况出现,因此能保证查询结果的准确性和一致性。因此不会出现幻读和不可重复读的问题。

🔥 设置隔离

  1. 查看当前会话隔离级别
    select @@transaction_isolation;
    
  2. 查看当前系统隔离级别
    select @@global.transaction_isolation;
    
  3. 设置当前会话隔离级别
    -- <isolation_level> 表示要设置的隔离级别,
    -- 可以是 READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE 中的任意一个。
    SET SESSION TRANSACTION ISOLATION LEVEL <isolation_level>;
    
  4. 设置当前系统隔离级别
    -- <isolation_level> 表示要设置的隔离级别
    -- 可以是 READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE 中的任意一个。
    SET GLOBAL TRANSACTION ISOLATION LEVEL <isolation_level>;
    
  5. mysql默认的事务隔离级别是REPEATABLE-READ,一般情况下,没有要求,没必要修改。
    -- 全局修改,修改mysql.ini配置文件,在最后加上:
    -- 可以是 READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE 中的任意一个。
    [mysqld]
    transaction-isolation=REPEATABLE-READ
    

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

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

相关文章

“微商城”项目(5登录和注册)

1.我的信息 在pages\User.vue文件中编写HTML结构代码&#xff0c;示例代码如下。 <template><div class"member"><div class"header-con"><router-link :to"{ name: login }" class"mui-navigate-right">&l…

段 寄 存 器-汇编复习(5)

图解演示8086CPU CS执行过程和逻辑 段 寄 存 器 8086CPU 在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。这里,需要看一下,是什么部件提供段地址。段地址在 8086CPU 的段寄存器中存放。8086CPU 有 4 个段存器: CS、DS、SS、ES。当80…

力扣刷题笔记——动态规划

动态规划基础 简称DP&#xff0c;如果某⼀问题有很多重叠⼦问题&#xff0c;使⽤动态规划是最有效的。 动态规划中每⼀个状态⼀定是由上⼀个状态推导出来的 1. 确定dp 数组&#xff08; dp table &#xff09;以及下标的含义 2. 确定递推公式 3. dp 数组如何初始化 4. 确定遍…

深度学习的分割方法

FCN&#xff1a;基于深度学习的语义分割模型 语义分割的定义&#xff1a;对像素进行精细化的分类。 用深度学习来解决语义分割&#xff0c;所面临的主要问题是&#xff1a; 早期的深度模型用于分类&#xff0c;输出一维向量&#xff0c;无法分割 深度模型不够精细 动机 如…

谈谈互联网广告拍卖机制的发展:从GSP到DeepAuction

广告作为各互联网公司收入的大头&#xff0c;其拍卖机制设计因此也是关乎营收最为核心的方面。所谓的广告拍卖机制设计是指如何将有限的广告位分配给合适的广告&#xff0c;从而达到客户、平台以及用户三方的价值最优。 当前的广告拍卖被建模为暗拍的形式&#xff0c;即N个广告…

ROS:launch启动文件的使用方法

目录 一、launch文件结构二、launch文件语法2.1根元素2.2参数设置2.3重映射、嵌套 三、示例3.1示例一3.2示例二3.3示例三3.4示例四 一、launch文件结构 由XML语言写的&#xff0c;可实现多个节点的配置和启动。 不再需要打开多个终端用多个rosrun命令来启动不同的节点了 可自动…

Swift 周报 第三十期

文章目录 前言新闻和社区App、App 内购买项目和订阅即将实行税率调整码出新宇宙Apple 公证服务更新Apple 设计大奖入围名单公布 提案通过的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组自主整理周报的第二十一期&#xff0c;每个模块已初步成型。各位读者…

C++进阶 —— C++11新增容器

目录 一&#xff0c;array 二&#xff0c;forward_list 三&#xff0c;unordered unordered_set unordered_multiset unordered_map unordered_multimap 静态数组array、forward_list、unordered系列&#xff1b; 一&#xff0c;array array是固定大小尺寸的序列容器&am…

2023年6月东莞/惠州/深圳CPDA数据分析师认证招生

CPDA数据分析师认证是大数据方面的认证&#xff0c;助力数据分析人员打下扎实的数据分析基础知识功底&#xff0c;为入门数据分析保驾护航。 帮助数据分析人员掌握系统化的数据分析思维和方法论&#xff0c;提升工作效率和决策能力&#xff0c;遇到问题能够举一反三&#xff0c…

100天精通Golang(基础入门篇)——第1天:学习Go语言基本概念

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

实战:Spring Cloud Stream消息驱动框架整合rabbitMq

文章目录 前言Spring Cloud Stream简析Spring Cloud Stream与rabbitmq整合1、添加pom依赖2、application.yml增加mq配置3、定义输入输出信道4、使用输入输出信道收发消息5、模拟正常消息消费6、模拟异常消息 前言 相信很多同学都开发过WEB服务&#xff0c;在WEB服务的开发中一…

Web端3D模型轻量化工具如何实现建筑行业“数字化”建设?

随着数字化技术的飞速发展&#xff0c;建筑行业也在不断寻找新的技术手段来提供高产能和建筑质量。其中&#xff0c;Web端3D模型轻量化工具HOOPS Communicator SDK在建筑行业中的应用不断地得到了市场的广泛注意和应用。本文将深入探讨HOOPS Communicator在建筑行业中的应用及其…

转动的车轮-第14届蓝桥杯国赛Scratch真题初中级组第2题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第144讲。 转动的车轮&#xff0c;本题是2023年5月28日上午举行的第14届蓝桥杯国赛Scratch图形化编程初中级组真题第2题…

Python数据攻略-DataFrame的数据操作

大家好&#xff0c;我是Mr数据杨&#xff0c;今天我们就来谈谈Python中的数据访问和修改。 首先&#xff0c;你们一定都听过《三国演义》吧&#xff0c;里面的人物和事情其实就像我们Python中的数据。比如曹操就像我们的数据元素&#xff0c;他的性格特点、军事才能等就像我们…

5年开发经验,看完这份37W字Java高性能架构,终于拿到架构师薪资

其实现在很多的开发人员并不能解决从架构的角度全方位地了解在Java编程过程中各阶段会出现的典型问题&#xff0c;更没办法深入到底层原理了解问题出现的原因&#xff01; 且随着当下面试越来越深入到底层&#xff0c;如果大家对于底层的原理不了解的话&#xff0c;是很难做出…

JDK11+mybatis-plus+shardingsphere分库分表

1、引入jar dynamic-datasource-spring-boot-starter&#xff1a;2.5.6 sharding-jdbc-spring-boot-starter&#xff1a;4.1.1 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId>&…

微调样本质量胜于数量 LIMA: Less Is More for Alignment

1、总体介绍 大型语言模型的训练分为两个阶段&#xff1a;&#xff08;1&#xff09;从原始文本中进行无监督的预训练&#xff0c;以学习通用的表征&#xff1b;&#xff08;2&#xff09;大规模的指令学习和强化学习&#xff0c;以更好地适应最终任务和用户的偏好。 作者通过…

作为网络安全工程师,都有哪些公司可以选?

招聘平台 首选内推 其次是公司自有招聘平台 再是第三方平台&#xff1a;boos直聘、前程无忧、拉钩、猎聘、牛客、牛聘 乙方 启明星辰 商标&#xff1a;云众可信&#xff0c;云子可信 投资&#xff1a;网御星云&#xff0c;恒安嘉新 拳头产品&#xff1a;Secin 社区、天清…

企企通×天能股份SRM一期项目成功上线,持续深化企业采购数字化

近期&#xff0c;企企通凭借在赋能客户数字化转型方面的优秀实践与丰富的解决方案&#xff0c;荣获天能电池集团股份有限公司&#xff08;以下简称“天能股份”&#xff09;颁发的“2022年度数字化优秀供应商奖”&#xff0c;同时&#xff0c;企企通SRM项目还获得天能股份采购管…

vue-cli4打包优化

项目开始时webpack配置 vue-cli3以后&#xff0c;我们修改webpack配置&#xff0c;需要自己在项目根路径下创建vue.config.js文件。 一、 配置 proxy 跨域 使用vue-cli发开项目&#xff0c;在本地开发环境中&#xff0c;如果遇到跨域的问题。可以通过配置proxy的方式&#xff…