前言
目录
2.5.2.2 模拟转账流程 李白给杜甫转账1000元 (自动提交事务模式)
2.5.2.3 模拟转账流程 李白给杜甫转账1000元 (手动提交事务模式)
一、事务的简介
注意:默认MvSQL的事务是自动提交的,也就是说,当执行一条DML(insert、update、delete、select)语句,MvSQL会立即隐式的提交事务。
二、事务操作
2.1 查看/设置事务提交方式
select @@autocommit;
2.2 手动开启事务
start transaction;
begin;
2.3 提交事务
commit;
2.4 回滚事务
rollback;
2.5 案例练习
2.5.1 查看MySQL事务
select @@autocommit;
为1表示自动提交,为0表示需要手动提交事务,改为手动之后再提交事务时候必须使用commit,同时也需要自己进行回滚。
2.5.2 银行转账模拟练习
2.5.2.1 创建余额表
表结构如下
create table account
(
id int auto_increment primary key comment '用户id',
name varchar(10) comment '姓名',
money int comment '余额'
);
添加数据
insert into account values('001','李白',5000),('002','杜甫',3000),('003','白居易',2500);
2.5.2.2 模拟转账流程 李白给杜甫转账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='杜甫';
4.查询账户表
select * from account;
2.5.2.3 模拟转账流程 李白给杜甫转账1000元 (手动提交事务模式)
设置MySQL为自动提交事务,设置autocommit为0。
set @@autocommit=0;
1.开启事务
start transaction;
以下插入数据对数据进行操作的流程同2.5.2.2。
执行出错,要对事务进行回滚。要么全部执行,要么一个也不执行。
n.提交事务
commit;
三、事务的四大特性
四、并发事务问题与事务的隔离级别
4.1 并发事务的问题
4.2 事务的隔离别
注意: 事物的隔离级别越高,数据越安全,但是性能越低。 需要去权衡数据的安全性和并发性,进行设置事物的隔离级别。
4.3 相关语句
4.3.1 查看事务的隔离界别
select @transaction_isolation;
4.3.2 设置事务的隔离界别
set
[session/global] transaction isolation level [read uncommitted | read committed |repeatable read |serializable];
4.4 实战练习
4.4.1 打开两个客户端进行操作
4.4.2 查看事务隔离级别
select @@transaction_isolation;
事务的隔离级别为默认值.
set session transaction isolation level read uncommitted;
4.4.3 查看当前表中的数据
4.4.4 在另一个客户端进行更新操作
set session transaction isolation level read uncommitted;
4.4.5 再另一个客户端进行查询操作
4.4.6 设置事务隔离级别为read committed
set session transaction isolation level read committed;
4.4.7 设置为repeatable read
set session transaction isolation level repeatable read;
在一个客户端查询id=4是否存在
select * from account where id='4';
在另一个客户端插入一条数据
select * from account where id='4';
在第一个客户端插入数据出现错误,但是查询id=4的仍然为空
select * from account where id='4';
出现幻读现象
4.4.8 设置事务的隔离级别为serializable;
当一个事务提交之后完毕之后另一个事务才开始执行,规避了幻读的问题。
注意:事务的隔离级别越高,数据越安全,但是性能越低。