文章目录
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);
-- 恢复数据操作
update account set money = 2000 where name = '张三' or name = '李四';
-- 转账操作
-- 方式一
select @@autocommit;
set @@autocommit = 0;
-- 方式二
start transaction ;
-- 1、查询发送方余额
select * from account where name = '张三';
-- 2、将数据从发送方减出
update account set money = money-1000 where name = '张三';
-- 3、将数据加入接收方
update account set money = money+1000 where name = '李四';
-- 成功:提交事务
commit ;
-- 失败:回滚事务
rollback ;
事务四大特性
1、原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败。
2、一致性:事务完成时,必须使所有事务的数据保持一致的情况。
3、隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
4、持久性:事务一旦提交或者回滚,它对数据库中的数据的改变就是永久的。
并发事务问题
脏读:一个数据读到另一个数据还没有提交的数据。
不可重复读:一个事务先后读去同一条记录,但两次读取的数据不同。
幻读:一个事务按照条件查询数据时,没有对应的数据行,但在插入数据时,又发现该行数据已存在,好像出现了幻影。
-- 事务隔离级别 transaction_isolation
select @@tx_isolation;
-- 改变当前数据隔离级别
set session transaction isolation level read uncommitted ;
set session transaction isolation level repeatable read ;