关闭

史上最简单的 MySQL 教程(三十八)「事务(上)」

标签: 数据库mysql事务事务安全
2664人阅读 评论(11) 收藏 举报
分类:

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

案例:银行的数据库里面存储着用户的账户信息表,当用户 A 想用户 B 转账的时候,正常情况下,A 账户的余额减少,B 账户的余额增加;但是由于某种原因(例如突然断电),当 A 账户的余额减少之后,B 账户的余额并没有增加,这就造成了数据库数据的安全隐患。

解决方案:当 A 账户的余额减少之后,不要立即修改数据表,而是在确认 B 账户的余额增加之后,同时修改数据表。

事务

通过前面的案例及解决方案,我们就引出了一个全新的概念,那就是:事务,即

  • 一系列将要发生或正在发生的连续操作。

事务安全,是一种保护连续操作同时实现(完成)的机制。事务安全的意义就是,保证数据操作的完整性

首先,执行如下 SQL 语句,创建银行账户表并插入数据:

-- 创建银行账户表
create table bank_account(
    id int primary key auto_increment,
    cardno varchar(16) not null unique comment 'bank card number',
    name varchar(20) not null,
    money decimal(10,2) default 0.0 comment 'account balance' 
)charset utf8;

-- 插入数据
insert into bank_account values
(null, '0000000000000001', 'Charies', 8000),
(null, '0000000000000002', 'Gavin', 6000);

1

接下来,让我们一起了解事务的操作。

事务操作

事务操作,分为两种:自动事务(默认的),手动事务

在这里,以银行账户的余额增减为例,我们来了解手动事务的操作流程。

第 1 步:开启事务,告诉系统以下所有操作,不要直接写入数据库,先存到事务日志。

  • 基本语法start transaction;

执行如上 SQL 语句,开启事务:

-- 开启事务
start transaction;

2

第 2 步:减少 Charies 账户的余额

-- 更新 Charies 账户余额
update bank_account set money = money - 1000 where id = 1;
-- 查询 bank_account 表数据
select * from bank_account;

3

如上图所示,Charies 账户的余额显示减少1000,但实际上,由于我们开启了事务,数据表真实的数据,并没有同步更新。为了验证这个论断,我们重新打开一个数据库客户端,查询bank_account表的数据:

4

如上图所示,显然数据库的事务安全机制起了作用,当我们开启(手动)事务之后,其后一系列操作并没有直接写入数据库,而是存入了事务日志。在这里,我们并没有打开数据库事务的日志进行验证,因为事务日志存储的是经过编译之后的字节码文件。

第 3 步:增加 Gavin 账户的余额

-- 更新 Gavin 账户余额
update bank_account set money = money + 1000 where id = 2;
-- 查询 bank_account 表数据
select * from bank_account;

5

如上图所示,Gavin 账户的余额显示增加1000,但是,由于我们开启了事务,数据表真实的数据,仍然没有同步更新。

第 4 步:提交事务或回滚事务

  • 提交事务基本语法commit;
  • 回滚事务基本语法rollback;

如果我们选择提交事务,则将事务日志存储的记录直接更新到数据库,并清除事务日志;如果我们选择回滚事务,则直接将事务日志清除,所有在开启事务至回滚事务之间的操作失效,保持原有的数据库记录不变。在这里,我们以提交事务为例:

-- 提交事务
commit;
-- 查询 bank_account 表数据
select * from bank_account;

6

如上图所示,当我们提交事务之后,数据库的真实记录更新,两个客户端的数据一致。

在此,值得我们注意的是:当我们提交事务之后,在进行回滚事务是不起作用的,因此事务日志在提交事务的同时已经被清除啦

此外,我们还要知道:现阶段,只有 InnoDB 和 BDB 两个存储引擎是支持事务安全机制的,其中 InnoDB 免费,BDB 收费。因此,InnoDB 使用的最为广泛。


温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

9
3
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

史上最简单的 MySQL 教程(三十九)「事务(下)」

温馨提示:在「事务(上)」中,我们已经了解了如何在 MySQL 中开启事务,以及事务的一些基本操作。在本文中,我们将进一步学习事务的知识,包括事务原理、自动事务、回滚点和特性等。 事务原理事务原理:在...
  • qq_35246620
  • qq_35246620
  • 2017-11-18 11:21
  • 1687

史上最简单的 Spring MVC 教程(一)

1 简介Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块,...
  • qq_35246620
  • qq_35246620
  • 2017-01-24 22:34
  • 9405

史上最简单的 SpringCloud 教程 | 终章

错过了这一篇,你可能再也学不会 Spring Cloud 了!Spring Boot做为下一代 web 框架,Spring Cloud 作为最新最火的微服务的翘楚,你还有什么理由拒绝。赶快上船吧,老船...
  • forezp
  • forezp
  • 2017-04-12 23:14
  • 364242

史上最简单的 MySQL 教程(二十)「数据的高级操作 之 主键冲突」

数据的高级操作数据的操作,无外乎增删改查。新增数据的基本语法为: insert into + 表名 + [(字段列表)] + values (值列表); 在数据插入的时候,假设主键对应的值已经存在,则...
  • qq_35246620
  • qq_35246620
  • 2017-06-03 20:38
  • 1720

史上最简单的 MySQL 教程

1 前言  数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变...
  • qq_35246620
  • qq_35246620
  • 2017-04-26 20:12
  • 7404

史上最简单的 MySQL 教程(二十七)「连接查询(下)」

连接查询连接查询:将多张表(大于等于 2 张表)按照某个指定的条件进行数据的拼接,其最终结果记录数可能有变化,但字段数一定会增加。连接查询的意义:在用户查询数据的时候,需要显示的数据来自多张表。连接查...
  • qq_35246620
  • qq_35246620
  • 2017-07-14 23:43
  • 1728

史上最简单的MySQL教程

安装:http://blog.csdn.net/qq_35246620/article/details/71105110 参考:http://blog.csdn.net/qq_3524662...
  • CSDN_LSD
  • CSDN_LSD
  • 2017-11-13 20:17
  • 106

史上最简单的 MySQL 教程(十)「列类型 之 日期时间型」

列类型(数据类型)所谓的列类型,其实就是指数据类型,即对数据进行统一的分类,从系统的角度出发是为了能够使用统一的方式进行管理,更好的利用有限的空间。在 SQL 中,将数据类型分成了三大类,分别为:数值...
  • qq_35246620
  • qq_35246620
  • 2017-05-06 12:35
  • 1890

史上最简单的 MySQL 教程(十二)「记录长度」

记录长度MySQL 中规定:任何一条记录最长不超过 65535 个字节,这意味着varchar永远达不到理论最大值。那么,varchar实际存储长度能达到多大呢?这由编码字符集决定。下面,以varch...
  • qq_35246620
  • qq_35246620
  • 2017-05-22 16:25
  • 1650

史上最简单的 MySQL 教程(二十二)「数据的高级操作 之 更新 & 删除」

数据的高级操作更新数据 基本语法: update + 表名 + set + 字段 = 值 + [where 条件]; 高级语法: update + 表名 + set + 字段 = 值 + [where...
  • qq_35246620
  • qq_35246620
  • 2017-06-25 18:34
  • 1719
    个人资料
    • 访问:812686次
    • 积分:11850
    • 等级:
    • 排名:第1471名
    • 原创:257篇
    • 转载:85篇
    • 译文:11篇
    • 评论:892条
    博主的 GitHub 账号
    GitHub : Charies Gavin

        鉴于 CSDN 糟糕的用户体验,博主会将一些优质的文章迁移到 Charies Gavin's Blog  欢迎大家在 GitHub 上 Follow 博主,以及 Fork、Star、Watch 博主的项目。


      青春不老 奋斗不止


      好学若饥虚心若愚
    博客专栏