MySQL学习笔记(15)--事务安全

·概念

·事务

要做的某个事情

  • 计算机中的事务是指某个程序执行单元(写操作)

  • 事务安全:当事务执行后,保障事务的执行是有效的,而不会导致数据错乱

  • 事务安全通常针对的是一连串操作(多个事务)而产生的统一结果

  • 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:Tom转出1000
记录到事务日志
关闭事务
成功:提交事务 同步到数据表\清除事务日志
失败:回滚事务 清除事务日志
事务2:Lucy转入1000
记录到事务日志
结束

小结

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扫码整个表),那么其他事务对整张表都不能操作
  • 脏读:一个事务在对某个数据进行操作但尚未提交,而另外一个事务读到了这个“历史”数据其实已经被修改
发布了19 篇原创文章 · 获赞 20 · 访问量 9523

猜你喜欢

转载自blog.csdn.net/qq_39323164/article/details/104161901