首页 > 数据库 >MySQL事务

MySQL事务

时间:2024-01-30 21:12:47浏览次数:23  
标签:事务 SAVEPOINT 回滚 product MySQL orders quantity

MySQL事务是一个执行单元,在mysql中,对数据的一次操作或多次操作可以组合成一个事务,这些操作要么同时成功执行,要么同时失败。

一、事务的性质

事务有四个基本特性,通常被称为ACID属性。

  1. 原子性(Atomicity): 如果事务中的所有操作都成功,则事务被提交。如果事务中的任何操作失败,则事务被回滚到启动事务之前的状态。

  2. 一致性(Consistency): 数据库应始终从一个一致的状态转换到另一个一致的状态。

  3. 隔离性(Isolation): 并发执行的事务的修改必须被隔离。事务看到的数据必须与其他并发事务无关。

  4. 持久性(Durability): 一旦事务被提交,其结果就是永久性的,即使发生故障也能恢复。

二、事务的基本操作

在MySQL中,事务包括以下基本操作:

  • START TRANSACTION 开始一个新的事务
  • COMMIT 提交当前事务
  • ROLLBACK 回滚当前事务
  • SAVEPOINT 在当前事务内创建一个保存点,以便将事务回滚到该点而非整个事务
  • ROLLBACK TO SAVEPOINT 回滚到指定的SAVEPOINT
  • RELEASE SAVEPOINT 删除一个SAVEPOINT

三、事务用例详解

例1:使用 START TRANSACTION、COMMIT 和 ROLLBACK

首先,我们创建一个表 orders

CREATE TABLE orders (
    id INT PRIMARY KEY,
    product VARCHAR(50),
    quantity INT,
    price DECIMAL(5, 2)
);

然后,我们插入一些数据:

INSERT INTO orders VALUES 
    (1, 'Apple', 10, 0.50),
    (2, 'Banana', 20, 0.25),
    (3, 'Orange', 15, 0.30);

假设我们执行以下事务:

START TRANSACTION;
UPDATE orders SET quantity = quantity - 1 WHERE product = 'Apple';
UPDATE orders SET quantity = quantity + 1 WHERE product = 'Orange';
COMMIT;

这个事务的目的是将'Apple'的数量减1,并将'Orange'的数量增1。当执行COMMIT操作时, 更改对所有其他用户都可见。如果这两个更新操作之一失败,如由于某些原因导致'Orange'无法增加数量,可以用ROLLBACK将事务回滚到最初的状态。

例2:使用 SAVEPOINT 和 ROLLBACK TO SAVEPOINT

让我们创建一个保存点并回滚到该点:

START TRANSACTION;
UPDATE orders SET quantity = quantity - 5 WHERE product = 'Banana';
SAVEPOINT reduce_apple;
UPDATE orders SET quantity = quantity - 5 WHERE product = 'Apple';
-- 假设此时'Apple'的库存不能更低,我们需要回滚到SAVEPOINT
ROLLBACK TO SAVEPOINT reduce_apple;
UPDATE orders SET quantity = quantity + 5 WHERE product = 'Orange';
COMMIT;

在这个事务中,如果在减少'Apple'的数量时出现问题,我们可以将事务回滚到SAVEPOINT,然后尝试对'Orange'进行类似的操作。

四、结束语

适当理解和使用事务可以在保证数据完整性的同时,有效提高多用户场景下的数据并发处理能力。希望上述示例能帮助您更好地理解和使用MySQL事务。

如果你有任何问题或者需要更深入的信息,非常欢迎你提问!

标签:事务,SAVEPOINT,回滚,product,MySQL,orders,quantity
From: https://www.cnblogs.com/lyxlucky/p/17997975

相关文章

  • Visual Studio 配置 MySQL
    1.将MySQL中的include文件和lib文件资源粘贴到VisualStudioinclude文件下和lib文件下找到MySQL的lib和include位置找到VisualStudio的include和bin文件位置将其放进去2.找到两个文件,放在创建的项目目录里在项目里,点击这个,打开文件夹位置......
  • Mysql存储过程设计
    存储过程的创建使用​--复制world.`user`所在库的表,复制名为user1CREATETABLEuser1asSELECT*fromworld.`user`DELETEfromuser1​--存储过程delimiter$CREATEPROCEDUREselect_all_user1()BEGINSELECT*fromuser1;END$delimiter;--存储过程调用​cal......
  • Zabbix升级MySQL数据库的故障
    收到一个MySQL安全漏洞告警,需要修复OracleMySQLJAN2024CriticalPatchUpdate因此想着升级MySQL,步骤如下:sudoapt-getupdatesudoapt-getupgrademysql-serversudosystemctlrestartmysqlmysql--version完成后Zabbix网页界面能打开,但是提示错误如下:TheZabbixdatabaseve......
  • mysql限定IP访问
     一、修改配置文件1.编辑MySQL的配置文件my.cnf(或者my.ini),该文件通常位于MySQL的安装目录下。2.找到[mysqld]部分,添加或修改以下行以启用访问控制:bind-address=0.0.0.0这将使MySQL监听所有IP地址。3.找到[mysqld]部分之后,在配置文件中添加以下行来限制允许访问的IP地......
  • MySQL-8.0.30升级MySQL-8.0.34
    记录一次MySQL漏洞升级操作升级背景:OracleMySQL官方发布MySQL-8.0.30版本高危漏洞CVE-2022-32221、CVE-2022-37434等,受影响版本涉及到8.0.32,官方建议升级至8.0.33,最好使用8.0.34,这里我们将MySQL-8.0.30升级至MySQL-8.0.34版本方案:将原mysql目录重命名,解压新的程序目录软链接到......
  • MySQL建索引报错:BLOB/TEXT column used in key specification without a key length
    MySQL建索引报错:BLOB/TEXTcolumnusedinkeyspecificationwithoutakeylength因为text类型的字段值太长,没办法为全部内容建立索引,只能指定前多少位字符建立索引;就像这样createindex`索引名`on表名(字段名(600));所以能用varchar能放下的尽量使用varchar吧......
  • 在 Windows 平台下安装与配置 MySQL 5.7.36
    Windows一般使用两种MySQL安装方式,即MySQL二进制分发版(.msi安装文件)和免安装版(.zip压缩文件)。一般来讲,应当使用二进制分发版,因为该版本比其他的分发版使用起来要简单,不再需要其他工具来启动就可以运行MySQL。本次实验是在Windows10平台上选用图形化的二进制安装方式,其他W......
  • python操作mysql
    python操作mysql1.数据库连接池在操作数据库时需要使用数据库连接池。pip3.9installpymysql#安装pymysqlpip3.9installdbutils#安装dbutilsimportthreadingimportpymysqlfromdbutils.pooled_dbimportPooledDBMYSQL_DB_POOL=PooledDB(creator=pym......
  • MySQL查看bin_log日志
    有这样一段业务逻辑,首先保存业务数据,然后发送报文,最后确认报文回来以后更新业务数据。伪代码大概是这样的:/***保存数据,并调用发送报文方法*/publicvoidsave(){//0.保存数据//调用send()方法send();}/***发送报文*/publicvoidsend(){/......
  • MySQL连接控制插件导致的连接数过多问题处理
    生产环境收到一波连接数告警,而该业务实际压力并不大。查看后发现有大量的waitinginconnection_controlplugin状态的连接等待。该等待连接数有一千多个。connection_control组件是由于前段时间的安全合规审查要求安装的。怕影响生产真实连接,将单个用户的登陆失败重试connectio......