·概念
·事务
要做的某个事情
-
计算机中的事务是指某个程序执行单元(写操作)
-
事务安全:当事务执行后,保障事务的执行是有效的,而不会导致数据错乱
-
事务安全通常针对的是一连串操作(多个事务)而产生的统一结果
-
MySQL中默认的写操作是直接写入的
- 执行写操作SQL
- 同步到数据表
示例
银行转账:从A账户转账到B账户
创建数据表
create table bank(
id int primary key auto_increment,
name varchar(50) not null,
account decimal(10,2) default 0.00
);
insert into bank values(null,'Tom',10000),(null,'Lucy',100);
转账:Tom向Lucy转账,一定是分为两步
# Tom扣钱
update bank set account = account - 1000 where id = 1;
# Lucy收钱
update bank set account = account + 1000 where id = 2;
- 以上两步必须都成功转账才能叫成功
- 两步操作无法确保哪一步会出问题(尤其是第二步)
- 为了保障两步都成功才能叫事务安全
·事务安全
事务安全是在操作前告知系统,接下来所有的操作都暂不同步到数据表,而是记录到事务日志,指导后续所有操作都成功,再进行同步;否则取消所有操作
以上述转账为例
小结
1、事务的目的就是为了保障连续操作的一致性,保证结果的完整性
2、事务的原理是通过将操作结果暂时保存在事务日志中,等所有操作的结果都是成功的,然后一并同步到数据表
·事务处理
利用自动或者手动方式实现事务管理
- 自动事务处理:系统默认,操作结束直接同步到数据表(事务关闭状态)
- 系统控制:变量 autocommit(值为ON,自动提交)
- 手动事务处理
- 开启事务:
start transaction
- 关闭事务
- 提交事务:
commit
(同步到数据表同时清空日志数据) - 回滚事务:
rollback
(清空日志数据)
- 提交事务:
- 开启事务:
- 事务回滚:在长事务执行中,可以在某个已经成功的节点处设置回滚点,后续回滚的话可以回到某个成功点
- 设置回滚点:
savepoint 回滚点名字
- 回滚到回滚点:
rollback to 回滚点名字
- 设置回滚点:
示例
1、手动事务:启用事务转账,成功提交事务
# 开启事务
start transaction;
# Tom扣钱
update bank set account = account - 1000 where id = 1;
# Lucy收钱
update bank set account = account + 1000 where id = 2;
# 提交事务
commit;
2、手动事务:启用事务转账,成功提交事务(回滚点)
# 开启事务
start transaction;
# Tom扣钱
update bank set account = account - 1000 where id = 1;
# 设置回滚点
savepoint sp1;
# Lucy收钱
update bank set account = account + 10000 where id = 2;
# 操作失败回到回滚点
rollback to sp1;
# Lucy收钱
update bank set account = account + 1000 where id = 2;
# 提交事务
commit;
3、自动事务
- Mysql默认是自动提交事务的:所以事务一旦发生就会立即写入到数据表(不能多个事务一起完成任务)
show variables like 'autocommit';
- 关闭自动提交事务(当前设置级别用户级:当前用户档次连接有效)
set autocommit = 0;
- 手动提交事务
insert into bank values(null,'Liu',1000);
commit;
小结
1、事务处理要应用到多次写操作组成的大事务中,如金融安全等
2、事务处理通常都会使用手动控制事务,没必要去修改原本的自动提交的机制,开启所有事务
3、扩展:事务处理的支持是有条件的
- 存储引擎需要为InnoDB
·事务特点
事务处理具有ACID四大特性
- 原子性(Atomicity ):一个事务操作是一个整体,不可拆分,要么都成功,要么都失败
- 一致性(Consistency):事务执行之前和执行之后都必须处于一致性状态,数据的完整性没有被破坏(事务逻辑的准确性)
- 隔离性(Isolation ):事务操作过程中,其他事务不可见
- 持久性(Durability ):事务一旦提交,结果不可改变
小结
1、事务特点需要在对应事务操作时,结合多个用户来看才能看的完整和亲切
2、扩展
- 事务锁:当一个事务开启时,另外一个事务是不能对当前事务锁占用的数据进行操作的
- 行所:当前事务只占用了一行(id精确检索数据),那么其他事务可以操作其他行数据
start transaction;
update bank set account = account + 1000 where id = 2;
-- 此时id为2的数据被锁,其他事务不能对它进行操作
- 表所:当前事务占用了整张表(like扫码整个表),那么其他事务对整张表都不能操作
- 行所:当前事务只占用了一行(id精确检索数据),那么其他事务可以操作其他行数据
- 脏读:一个事务在对某个数据进行操作但尚未提交,而另外一个事务读到了这个“历史”数据其实已经被修改