学习目标:
定义:事务就是将一组SQL语句放在同一批次内去执行
特点:如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
注意:MySQL事务处理只支持InnoDB和Berkeley DB数据表类型
脏读:当一个事务在执行操作时未提交,另一个事务查看事务时将刚才未提交的事务查询到
幻读:读取到数据,因某一事务的原因,导致刚才的数据消失
查事务隔离级别的方法:
方式一:
mysql> select @@tx_isolation;
方式二:
mysql> select @@global.tx_isolation;
方式三:适合版本较高
mysql> select @@[session/global].transaction_isolation;
session:代表当前会话 global:代表全局 默认session
先查看自己的MySQL版本,我的是MySQL 8.0,查看默认隔离级别:
mysql> select @@session.transaction_isolation;
mysql>set session transaction isolation level 设置事务隔离级别
mysql> set session transaction isolation level read uncommitted;
mysql> set global transaction isolation level read uncommitted;
查看设置结果:
mysql> select @@session.transaction_isolation;
SET AUTOCOMMIT
使用SET语句来改变自动提交模式
SET AUTOCOMMIT = 0; #关闭自动提交模式
SET AUTOCOMMIT = 1; #开启自动提交模式
注意:
查看默认事务提交方式
mysql> select @@autocommit;
关闭自动提交事务
mysql> set autocommit =0;
键入CMD,同时打开两个命令提示符窗口。第一个窗口:首先查看事务提交方式,发现是自动提交(1);然后在第二个窗口关闭自动提交,再查询事务提交方式,发现只关闭了当前会话的提交模式,第一个窗口还是自动提交。截图如下:
START TRANSACTION 开始一个事务,标记事务的起始点
COMMIT 提交一个事务给数据库
ROLLBACK 将事务回滚,数据回到本次事务的初始状态
SET AUTOCOMMIT =1; 还原MySQL数据库的自动提交
(1)关闭自动提交:
mysql>set autocommit=0;
(2)开始事务
mysql>start transaction; 或者begine;
(3)执行一系列SQL
mysql>删除、更新等
(4.1)假设出异常 事务回滚
mysql>rollback;
(4.2)假设一切正常 提交事务
mysql>commit;
(5)还原MySQL数据库的自动提交
mysql>set autocommit =1;
顾客A在线购买一款商品,价格为500.00元,假如顾客A银行卡上的余额为2000.00元,且向卖家B支付购买商品费用500.00元,起始卖家B的账号金额10000.00元。
创建数据库shop和创建表account并插入两条数据
用到的命令:
mysql> create database shop;
mysql> use shop;
mysql> create table account(
-> id int not null primary key auto_increment,
-> name varchar(32) not null,
-> cash decimal(9,2) not null);
mysql> insert into account(name,cash) values('A',2000.00);
mysql> insert into account(name,cash) values('B',10000.00);
截图:
设置场景:
A账户成功减少500元,B账户应该增加500元,但一些错误导致未增加成功,这时需要返回A账户的500元,达到账户总额的平衡。
mysql> begin;
mysql> select * from account;
mysql> update account set cash =cash - 500 where id =1;
以下语句模拟错误
mysql> update account set cash = cashh + 500 where id =2;
mysql> rollback;
截图:
开始事务,查询账户
A账户成功减少500元
B账户出错未增加500元
事务回滚,将钱退还给A账户