MySQL中的事务

2023-11-10

1 事务介绍
  本篇文章我们来介绍数据库中事务的概念以及如何使用MySQL命令行窗口来进行数据库的事务操作。事务是联合操作中我们数据库稳定运作和数据不发生不可预知错误的重要依赖。
  事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑中,所有的操作要么全部成功,要么全部失败。在各个数据具有特别紧密的联系时,最好是使用数据库的事务来完成逻辑处理。
2 实例介绍
  我们先假设有一组数据操作是银行转账,A用户给B用户转账10000元,则MySQL有以下的操作:

update account set count = count - 10000 where name = 'A';
update account set count = count + 10000 where name = 'B';

  在上面两条SQL语句中,任意一条SQL执行过程中出现了错误,或者第一条正常执行,第二条由于网络中断请求失败,那么就有可能造成A与B两人最后总金额的错误。但如果是使用事务来处理,即使上面的转账过程出现了错误,那么之前执行的数据库操作即使成功也会一并回滚,形成所有的SQL操作全部失败,保证所有人的金额不变。
  MySQL数据库默认事务是自动提交的,也就是发一条SQL数据库就执行一条。如果想将多条SQL放置在一个事务中执行,就必须使用如下语句:

    start  transaction
    sql1
    sql2
    …
    commit

  当开启事务后(start transaction),无论数据库是否对其中的多条SQL语句是否执行成功,只要没有提交事务(commit),都会将之前执行的SQL进行回滚。使数据回到开启事务之前的值。
  在MySQL中,与事务相关的有开启事务(START TRANSACTION),提交事务(COMMIT),回滚事务(ROLLBACK)等等,下面将依次使用到。
  接下来将会在先使用数据库命令行窗口来进行事务操作的案例。
 2.1 定义数据库与表
  首先定义表account和客户以及金额两个列数据项:

    create database bank;

    use bank;

    create table account(
         id int primary key auto_increment,
         name varchar(40),
         money double
    );

    insert into account(name,money) values('a',50000);
    insert into account(name,money) values('b',80000);

 2.2 开启事务模拟转账
  接下来我们再开启事务模拟转账,输入SQL命令,最后提交事务(Commit),来确保这个事务内所有的SQL命令都能被执行成功,依次输入以下SQL语句:

    start transaction; -- 开启事务

    update account set money=money-10000 where name=’A’;
    update account set money=money+10000 where name=’B’;

    commit;  -- 提交事务

  上面提交才能真正意义上将所有事务中逻辑命令执行,所以说如果我们想将多条SQL作为整体执行,只要有一个条SQL执行失败或者数据库突然出错就回滚到最开始执行之前的状态,使用事务是最好的选择。
 2.3 回滚事务
  最后来看看事务回滚(ROLLBACK)。如果我们在事务处理的过程中,提交事务(Commit)之前,如果想回滚之前的操作,可以使用ROLLBACK这条SQL命令。

rollback;

  注:使用ROLLBACK命令将回滚之前到开启事务的所有SQL语句,而不会只回滚前面一条SQL命令,因此即使我们对A和B的金额操作了多次,最终还是回到事务开启前的金额数。
  
  以上就是本文主要想介绍的开启事务,提交事务和回滚事务三种关于事务的操作。


  参考博客:
  http://www.cnblogs.com/fjdingsd/p/5272952.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL中的事务 的相关文章

  • Codeigniter 加入多个条件

    我正在使用 Codeigniter Active Records 课程 我想加入我的users与我的桌子clients表 这样我就可以显示用户的 真实 姓名 而不仅仅是他们的 ID 这是什么clients表看起来像 示例 列 a 1 a 2
  • 使用唯一索引删除重复项

    我在两个表字段 A B C D 之间插入 相信我已经在 A B C D 上创建了唯一索引以防止重复 然而我以某种方式简单地对这些做了一个正常的索引 因此插入了重复项 这是2000万条记录的表 如果我将现有索引从普通索引更改为唯一索引 或者只
  • mysql语句中的*星号是什么意思?

    Ex mysql query SELECT FROM members WHERE id id 这意味着选择表中的所有列
  • mySQL MATCH 跨多个表

    我有一组 4 个表 我想对其进行搜索 每个都有全文索引 查询可以使用每个索引吗 CREATE TABLE categories id int 5 unsigned NOT NULL auto increment display order
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • 为什么 MySQL 创建带有 _seq 后缀的表?

    我创建了一个 InnoDB 表 名为foo在 MySQL 中 一旦我对表执行插入操作 我就会看到另一个表foo seq被建造 如果我删除自动生成的表 它会在下一次插入后出现 是什么原因造成的 听起来像是正在创建一个序列 您是否有自动生成的主
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • 如何在Mysql中仅将不同的值从一个表复制到另一个表?

    我有一个大约 2 5GB 的 MySql 数据库 表 A 具有以下列 anoid query date item rank url 我刚刚创建了另一个仅包含列的表 b query and date 我想在查询列中插入所有不同的记录 及其各自
  • 为什么我的 if 语句没有按我预期的方式工作?

    我正在尝试实现以下目标 我向我的 SQL 数据库询问使用SELECT FROM subjects 这样做之后我要求使用数组mysqli fetch assoc 在那之前一切都很好 现在的问题是 当我尝试在每个循环中修改 genero 的值
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • 比特纳米。重置mysql根密码

    我如何重置 MySQL 中的 root 密码和帐户 因为我按照如何为其他服务器授予权限的说明操作 并且意外地将 root 用户 Mysql 绑定到其他 IP 地址 现在看来我无法在 localhost 上以管理员身份登录 Thanks 您有
  • gem install mysql:无法构建 gem 本机扩展 (Mac Lion)

    我为 Mac OS X Lion 安装了 MySQL 5 5 27 来自 dmg 现在我尝试安装 mysql gem gem install mysql Building native extensions This could take
  • Bugzilla 中分离客户端的基本权限

    我正在尝试配置一个 Bugzilla 实例 这将允许我的客户登录并为其正在开发 维护的网站提交错误 例如 我创建了 2 个名为 TestProject TestProject2 的产品和一个名为 TestClient 的用户 我想要实现的是
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen

随机推荐

  • Sqli-labs——lesson11

    在11关是登录界面了 我们可以先用bp抓包来看它的post请求来再在Hackbar里面的post data里面对数据进行操作 1 在对uname的admin加上 后回显错误 说明此处存在注入漏洞 2 首先先在username中验证 用 or
  • matlab读.h5文件

    之前用 python 给 nuswide 提取了 VGG19 特征 因为文件太大 超过 mat 限制 存成 h5 见 1 现在一个 matlab 程序要读 可以用 h5disp 查看 h5 文件内容的结构 各个 datasets 然后用 h
  • DDK(Driver Developer Kit)和WDK(Windows Driver Kit)的区别

    首先 先从基础的东西说起 开发WINDOWS下的驱动程序 需要一个专门的开发包 如 开发JAVA程序 我们可能需要一个JDK 开发WINDOWS应用程序 我们需要WINDOWS的SDK 现在开发WINDOWS下的驱动程序 我们需要一个DDK
  • 个人兴趣项目汇总

    实时多人2d监测平台 deh传感器数据监控大屏 deh数字孪生 three js deh故障诊断软件系统 SAR故障诊断系统 自动化工厂展示大屏 Minest数据集数字检测平台 汇总在线展示链接
  • Java代码审计之命令执行漏洞

    进行代码审计时遇到一个比较典型命令执行漏洞 适合新手学习 给大家分享下整个过程 从代码中可以看出来程序只使用trim 方法对jdk进行了两遍的空格过滤 然后直接和后面拼接的命令一起执行 接着来找一下这个方法的调用链 可以看到这里依次调用了3
  • jquery怎么获取radio的值

    1 获取选中值 三种方法都可以 input radio checked val input type radio checked val input name rd checked val
  • java 实体类 临时注解_MyBatis-Plus 常用注解

    TableName TableId 主键专属 比如数据中的表中的字段是id 但是实体类是userId 那么就需要在userId上打上这个注解 用法 设置主键映射 value映射主键字段的名字 type 设置主键类型 主键的生成策略 圈起来的
  • git提交代码完整目录(详细)

    1 找到需要提交的git代码 2 初始化 git init 3 查询状态 git status 4 添加代码 git add test txt test txt是需要提交的文件 git add all 提交所有 5 git文件commit仓
  • DKVMN知识追踪描述

    由于在线学习课程的兴起 学习者在课程学习过程中有很多习题练习的记录 利用这些记录 知识追踪 Knowledge Tracing 希望通过对学习者过往练习的结果分析其当前对一些概念的掌握程度 知识追踪任务可以形式化为一个有监督的序列学习问题
  • eclipse + armgcc + pyocd(CMSIS-DAP) 进行嵌入式MCU Debug

    eclipse armgcc pyocd CMSIS DAP 进行嵌入式MCU Debug 由于中美贸易战的影响 备用方案将采用国产MCU 经过乱开发委员会的评估 认为华大 HDSC 的MCU性价比不错 但是keil官网找不到所选芯片的pd
  • Java thread中对异常的处理策略

    https www cnblogs com googlemeoften p 5769216 html
  • Flutter开发之滚动Widget

    移动端数据量比较大时 我们都是通过列表来进行展示的 比如商品数据 聊天列表 通信录 朋友圈等 在Android中 我们可以使用ListView或RecyclerView来实现 在iOS中 我们可以通过UITableView来实现 在Flut
  • sql中对日期的筛选

    转载自 点击打开链接 几个小时内的数据 DATE SUB NOW INTERVAL 5 HOUR 今天 select from 表名 where to days 时间字段名 to days now 昨天 SELECT FROM 表名 WHE
  • Flutter —— dart基础语法

    Flutter dart基础语法 1 Flutter 项目创建 2 Dart 语法 2 1 var final和const 2 2 num 2 3 string 2 4 list 和 map 2 5 和 2 6 方法 和 箭头函数 2 7
  • 刚面完的字节跳动Python软件测试用例编写(含思路)

    测试用例编写是软件测试的基本技能 也有很多人认为测试用例是软件测试的核心 软件测试中最重要的是设计和生成有效的测试用例 测试用例是测试工作的指导 是软件测试的必须遵守的准则 在这里我们不讨论以上的各种观点 但是综上所述 大家可以看出 测试用
  • QT中的connect用法总结

    第一种 首先来看看老版本的 connect 写法 比较复杂些 需要将信号和槽进行明确的指定 包括形参 看一个示例 为方便演示 先自定义一个 Button 然后定义两个重载的信号 lass MyButton public QWidget Q
  • 仓库 “https://download.docker.com/linux ubuntu Release” 没有 Release 文件。N: 无法安全地用该源进行更新,所以默认禁用该源

    解决 E 仓库 https download docker com linux ubuntu Release 没有 Release 文件 N 无法安全地用该源进行更新 所以默认禁用该源 在ubuntu16 04上安装Docker Engin
  • CentOS 7 修改系统运行级别(单用户/正常启动)

    常用的系统运行级别 3级 带网络多用户命令行界面 multi user target 5级 带网络多用户图像化界面 graphical target 正常启动的系统使用systemctl命令修改运行级别 查看当前运行级别 systemctl
  • [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

    前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索 Eastmount 关键字及截图的功能 而这篇文章主要简单介绍如何实现自动登录163邮箱 同时继续介绍Selenium Python官网Locating
  • MySQL中的事务

    1 事务介绍 本篇文章我们来介绍数据库中事务的概念以及如何使用MySQL命令行窗口来进行数据库的事务操作 事务是联合操作中我们数据库稳定运作和数据不发生不可预知错误的重要依赖 事务是指数据库中的一组逻辑操作 这个操作的特点就是在该组逻辑中