简介
是什么:一组操作的集合,不分割的工作单位,事务会把所有的操作作为一个整体,向数据库发起操作,要么全部失败要么全部成功。
案例:
银行转账
事务的流程(默认不开启事务,手动开启提交,回滚事务)
基本操作
控制事务方式一:
查看事务的提交方式:
select @@autocommit;
通过set指令设置系统变量将提交方式改为手动set @@autocommit=0
(0为手动,1为自动)提交事务
commit;
回滚事务
rollback
控制事务方式二:
- 开启事务:
start transaction 或 begin;
- 提交事务:
commit;
- 回滚事务:
rollback;
案例:
-- 以store数据库为例建表
use store;
-- 数据准备
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 * from account where name = "张三";
update account set money = money - 1000 where name = "张三";
update account set money = money + 1000 where name = "李四";
-- 模拟转账出现错误的情况
select * from account where name = "张三";
update account set money = money - 1000 where name = "张三";
程序抛出异常...
update account set money = money + 1000 where name = "李四";
-- 解决方法:控制事务(方法1:)
select @@autocommit;-- 查看事务提交方式
set @@autocommit = 0; -- 设置为手动提交
-- 转账操作 (张三给李四转账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 = '李四';
-- 提交事务
commit;
-- 回滚事务
rollback ;
-- 方式二
-- 转账操作 (张三给李四转账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;
四大特征
C:\ProgramData\MySQL\MySQL Server 8.0\Data
每一个数据库对应一个文件夹。并发事务
A,B事务同时操作同一张数据库表时引发的问题
事务隔离级别(解决并发事务的问题)(数据安全度和性能成反比权衡安全和并发性)
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommited | √ | √ | √ |
Read commited | × | √ | √ |
Repeatable Read(默认) | × | × | √ |
Serializable | × | × | × |
查看事务隔离级别
select @@transaction_isolation;
设置事务隔离级别
set [session | global] transaction isolation level {read uncommited | read commited | repeatable read | serializable}
示例
-- 查看事务隔离级别
select @@transaction_isolation;
-- 设置事务隔离级别
set session transaction isolation level read uncommitted ;
set session transaction isolation level repeatable read ;
Mysql(基础——增删改查)
概述,sql(ddl,dml,dql,dcl),函数(字符串处理,日期处理,数值,流程控制),约束(主键,非空,默认,检查8.0.16,外键),多表查询(1:1,1:n,n:n,外连接,内连接,子查询),事务(四大特性,并发事务引发的问题)