写在前面
大家好,这里是立志于在有生之年看到并参与通用人工智能开发工作的Nobody,由于最近在公司要经常性地接触大数据工具,所以打算开一个大专栏对大数据工具进行学习总结整理。
以下为该部分的前置博客
大数据闯关之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!