当前位置: 首页 > article >正文

事务-----mysql

在MySQL中,事务是通过一组SQL语句组成的逻辑工作单元,这些语句要么全部成功执行,要么全部失败回滚。定义一个事务通常包括以下步骤:

  1. 开始事务:使用START TRANSACTIONBEGIN语句来开始一个新的事务。

  2. 执行SQL语句:在事务中执行一系列的SQL操作(如INSERTUPDATEDELETE等)。

  3. 提交或回滚事务

    • 如果所有操作都成功,使用COMMIT语句提交事务,使更改永久生效。

    • 如果任何操作失败,使用ROLLBACK语句回滚事务,撤销所有更改。

具体步骤

1. 开始事务

使用START TRANSACTIONBEGIN语句来开始一个新的事务。

START TRANSACTION;
-- 或者
BEGIN;
2. 执行SQL语句

在事务中执行一系列的SQL操作。例如:

UPDATE accounts SET balance = balance - 200 WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 200 WHERE name = 'Bob';
3. 提交或回滚事务
  • 提交事务:如果所有操作都成功,使用COMMIT语句提交事务。

    sql

    复制

    COMMIT;
  • 回滚事务:如果任何操作失败,使用ROLLBACK语句回滚事务。

    sql

    复制

    ROLLBACK;

示例

假设我们有一个accounts表,结构如下:

CREATE TABLE accounts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    balance DECIMAL(10, 2) NOT NULL
);

表中插入两条记录:

INSERT INTO accounts (name, balance) VALUES ('Alice', 1000.00);
INSERT INTO accounts (name, balance) VALUES ('Bob', 500.00);

现在,Alice要向Bob转账200元。这个操作需要两个步骤:

  1. 从Alice的账户中扣除200元。

  2. 向Bob的账户中增加200元。

我们可以使用事务来确保这两个操作要么全部成功,要么全部失败:

START TRANSACTION;

-- 从Alice的账户中扣除200元
UPDATE accounts SET balance = balance - 200 WHERE name = 'Alice';

-- 向Bob的账户中增加200元
UPDATE accounts SET balance = balance + 200 WHERE name = 'Bob';

-- 提交事务
COMMIT;

如果在事务执行过程中发生错误,比如Alice的余额不足,我们可以回滚事务,撤销所有操作:

START TRANSACTION;

-- 从Alice的账户中扣除200元
UPDATE accounts SET balance = balance - 200 WHERE name = 'Alice';

-- 检查Alice的余额是否足够
SELECT balance INTO @alice_balance FROM accounts WHERE name = 'Alice';
IF @alice_balance < 0 THEN
    -- 如果余额不足,回滚事务
    ROLLBACK;
ELSE
    -- 向Bob的账户中增加200元
    UPDATE accounts SET balance = balance + 200 WHERE name = 'Bob';
    -- 提交事务
    COMMIT;
END IF;

自动提交模式

MySQL默认处于自动提交模式(autocommit=1),即每条SQL语句都会自动提交。要使用事务,通常需要禁用自动提交模式:

SET autocommit = 0;

禁用自动提交后,必须显式地使用COMMITROLLBACK来结束事务。

总结

定义一个事务的基本步骤包括开始事务、执行SQL语句、提交或回滚事务。通过使用事务,可以确保一组操作要么全部成功,要么全部失败,从而保证数据库的一致性和完整性。


http://www.kler.cn/a/539531.html

相关文章:

  • MongoDB 有哪些特性
  • JAVA中的抽象学习
  • React受控组件的核心原理与实战精要
  • 网络工程师 (26)TCP/IP体系结构
  • 在 Ubuntu 上安装 MySQL 的详细指南
  • ZooKeeper 的典型应用场景:从概念到实践
  • 数字滤波器的分类
  • spring-ioc-高阶知识
  • PHP语言的物联网
  • python实战(十六)——基于LSTM的股价预测
  • MCU应用踩坑笔记(ADC 中断 / 查询法)
  • UnityShader学习笔记——渲染路径
  • 数据表记录
  • Nginx配置 ngx_http_proxy_connect_module 模块及安装
  • 加速汽车软件升级——堆栈刷写技术的应用与挑战
  • go语言文件和目录
  • RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决
  • 用jit部分python函数效率过低的问题
  • java: framework from BLL、DAL、IDAL、MODEL、Factory using oracle
  • HTML之CSS三大选择器
  • 110,【2】攻防世界 web mfw
  • ScrapeGraphAI颠覆传统网络爬虫技术
  • 未来科技趋势浅析
  • scss模块化
  • 如何用.NET Core Identity实现定制化的用户身份验证系统
  • Vue 响应式渲染 - 条件渲染