第六课 基础篇_事务
一.事务简介
事务是一组操作的集合,他是一个补课分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败.
二.事务操作
1.数据准备
--事务操作
--数据准备
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);
2.转账操作
--转账操作(张三给李四转账1000)
-- 1.查询张三账户余额
select * from account where name='张三';
-- 2.将张三的账户余额-1000
update account set money=money-1000 where name='张三';
-- 如果此处异常则后面的语句不执行.(张三的账户-1000,但李四的账户没有变化),这里是三个事务.
-- 3.将李四的账户余额+1000
update account set money=money+1000 where name='李四';
3.查看设置事务提交方式
– 查看系统事务自动提交方式,1为自动提交,0为手动提交.
SELECT @@autocommit;
– 将系统事务提交方式改为手动
SET @@autocommit=0
4.提交事务
COMMIT;
5.回滚事务
ROLLBACK;
6.开启事务
START TRANSACTION 或 BEGIN;
三.事务四大特性(ACID)
1.原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败.
2.一致性(Consistency):事务完成时,必须使所有数据保持一致状态.
3.隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境运行.
4.持久性(Durability):事务一旦提交或回滚,他对数据库中的数据的改变就是永久的.
四.并发事务问题
问题 | 描述 |
---|---|
脏读 | 一个事务读到另一个事务还没有提交的数据 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同 |
幻读 | 一个事务按照条件查询数据时,没有对应数据,但是在插入数据时,又发现该数据已经存在 |
五.事务隔离级别
1.隔离级别分类
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | ✔ | ✔ | ✔ |
Read committed(Oracle默认) | ✘ | ✔ | ✔ |
Repeatable Read(MySQL默认) | ✘ | ✘ | ✔ |
Serializable | ✘ | ✘ | ✘ |
2.查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
3.设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE};
注意:事务隔离级别越高,数据越安全,但是性能越低.