事务

1. 事务概念

[!note] 概念:一段业务逻辑,要么全部成功,要么全部失败,不允许某部分成功的情况。 代码实现:就是将一组SQL代码放到一个批次中执行。

2. ACID原则

参考博客:事务ACID理解

2.1. 介绍

概念 描述
原子性(atomicity) 整个过程要么全部成功,要么全部失败
一致性(consistency) 操作后与操作前,数据状态一致
隔离性(isolation) 多用户并发,不会相互影响
持久性(durability) 事务「提交」到数据库,数据库改变且不可逆(回滚无效)
事务没有提交到数据库,数据库恢复原状(数据库回滚

2.2. 隔离所导致的问题

2.2.1. 脏读

A,B事务同时对「同一数据」进行操作,A在执行过程中并「还未提交」,B在「数据最开始的状态」上进行了修改并提交。这样B就对数据进行了脏读。

[!note|style:flat] 还有事务在运行时,进行数据获取,提交修改。

2.2.2. 不可重复读

A事务运行时,多次对统一行数据进行「读取」。在此期间有其他事务「对数据修改」完成了提交,这样就会导致A事务的多次读取「数据值不一样」。

[!note|style:flat] 多次读同一位置的数据,值不一样

2.2.3. 幻读

A事务运行时,多次对数据进行「读取」。在此期间有其他事务「添加了新数据修」完成了提交,这样A事务前后读取的「数据量不一样」。

[!note|style:flat] 多次读取某几行数据,突然多了一行数据

3. SQL操作

3.1. 事务自动提交

[!note|style:flat] MySQL默认开启自动提交。

-- 关闭
set autocommit = 0;

-- 开启
set autocommit = 1;

3.2. 存档点 (了解)

-- 存档点
savepoint 保存点
-- 回退存档点
rollback to 保存点
-- 删除存档点
release 保存点

[!note|style:flat] 事务失败了,这存档点也没啥用了。

3.3. 事务

-- 关闭自动提交
set autocommit = 0;

-- 开启事务
start transaction

具体代码逻辑

-- 成功:提交
commit;

-- 失败:回滚,恢复数据
rollback;

-- 开启自动提交
set autocommit = 1;

[!note|style:flat]

  • 首先要关闭自动提交,事务执行完在开启。
  • commit rollback后,就会关闭事务,所有特别关闭transaction

4. 行级锁

set autocommit = 0;

-- 查询
select `字段` from `表名` where id = 1 for update 

-- 修改
update `表名` set `字段`=where id = 1

commit
set autocommit = 1;

[!note|style:flat]

  • select for update:锁数据,为MySQL InnoDB 默认行级锁
  • 一条 SQL 语句用不到「索引」是不会使用行级锁的,会使用表级锁把整张表锁住。

results matching ""

    No results matching ""