大数据闯关之MySQL基础篇(九):事务-灵析社区

秋叶无缘

   

写在前面

大家好,这里是立志于在有生之年看到并参与通用人工智能开发工作的Nobody,由于最近在公司要经常性地接触大数据工具,所以打算开一个大专栏对大数据工具进行学习总结整理。

以下为该部分的前置博客

大数据闯关之MySQL基础篇(八):多表查询

大数据闯关之MySQL基础篇(七):约束

大数据闯关之MySQL基础篇(六):函数

大数据闯关之MySQL基础篇(五):DCL用户管理

大数据闯关之MySQL基础篇(四):DQL数据查询操作

大数据闯关之MySQL基础篇(三):DML数据操作

大数据闯关之MySQL基础篇(二):数据库操作

大数据闯关之MySQL基础篇(一):MySQL安装及基础介绍

一、事务简介

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

默认的,MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式地提交事务

二、事务操作

  • 首先先准备数据,按以下语句创建表以及向表中插入数据
create table account(
    id int auto_increment primary key comment '主键ID',
    name varchar(10) comment '姓名',
    money int comment '余额'
) comment '账户表';
insert into account(id, name, money) VALUES (null,'张三',2000),(null,'李四',2000);
首先有一个转账操作,有以下几个步骤:查询张三账户余额、将张三账户余额-1000,将李四余额+1000
select * from account where name = '张三';  -- 1. 查询张三账户余额
 
update account set money = money - 1000 where name = '张三';  -- 2. 将张三账户余额-1000
 
update account set money = money + 1000 where name = '李四';  -- 3. 将李四账户余额+1000

这样就完成了张三向李四转账1000元的操作

  • 假设说向李四转账失败会发生什么,例如


-- 转账操作 (张三给李四转账1000)
-- 1. 查询张三账户余额
select * from account where name = '张三';
 
-- 2. 将张三账户余额-1000
update account set money = money - 1000 where name = '张三';
 
程序异常
 
-- 3. 将李四账户余额+1000
update account set money = money + 1000 where name = '李四';

会发现有一句: 程序异常,这句话并非sql语句或者注释,那么程序就会报错,以至于张三的钱会扣1000,而李四的钱不会变多,因此这1000块就不翼而飞了。因此我们要将这个转账操作写在一个事务里面。有以下两种方式可以控制事务

  • 事务操作方式一
    • 查看/设置事务提交方式,1为自动提交,0为手动提交
SELECT @@autocommit;
SET @@autocommit-0;
    • 提交事务
commit;
    • 回滚事务


rollback;
    • 只要在sql语句前将事务提交方式设置为手动提交,在写完sql语句后执行commit即可
  • 事务操作方式二


-- 转账操作 (张三给李四转账1000)
start transaction ;  -- 开启事务
 
-- 1. 查询张三账户余额
select * from account where name = '张三';
 
-- 2. 将张三账户余额-1000
update account set money = money - 1000 where name = '张三';
 
程序执行报错 ...
 
-- 3. 将李四账户余额+1000
update account set money = money + 1000 where name = '李四';
 
-- 提交事务
commit;
 
-- 回滚事务
rollback;

可以看到,这个程序一定会出错,那么我们就不需要commit了,只需要rollback即可。

三、事务四大特性ACID

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
  • 一致性(Consistency):事务完成时,必须使得所有的数据都保持一致状态
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

四、并发事务问题

当A事务和B事务同时操作同一个表时会引发以下三个问题

  • 脏读:一个事务读到另外一个事务还没有提交的数据
  • 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
  • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在

五、事务隔离级别

事务隔离级别的设置就是为了解决以上的并发事务问题的

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable Read(默认)××
Serializable×××


--查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
 
--设置事务隔离级别
SET [SESSION|GLOBAL] TAANSACTION ISOLATION LEVEL {Read uncommitted|Read committed|Repeatable Read|Serializable};

基础篇到这里就结束了,下一篇章将进军Hadoop!


阅读量:1010

点赞量:0

收藏量:0