GORM框架基础:Mysql事务 | 豆包MarsCode AI刷题

74 阅读3分钟

概念

什么是事务?

在mysql中,事务是一种确保数据库操作序列的原子性,一致性,隔离性和持久性的机制。主要是处理操作量大,复杂度高的数据;事物、务可以包括一个或者多个数据库操作,例如插入更新或者删除记录;

为什么需要事务?

事务可以保证成批的SQL语句可以全部执行,要么全部执行,要么全都不执行,比如删除一个人员信息,既要删除基本资料,又要删除相关信息,可以放到事物、务中一起执行,保证数据库的完整性;

image.png

事务的特征(ACID)

  1. 原子性:事务要么执行,要么失败,不可拆分
  2. 一致性:数据库在任意的时间都保持一致性
  3. 隔离性:事务之间的执行互不影响(与隔离的级别有关)
  4. 持久性:事务一旦执行完毕,对数据库是永久性的改变,不可恢复

image.png 原子性、隔离性、持久性都是为了一执行服务;

事务的操作

1.开启事务

事物默认是开启的:

image.png

on表示开启,没有开始和结束的标记,一条insert,update,delete。也就是说一条SQL语句默认就是一条事务;如果关闭autocommit,就不会自动commit:

#关闭自动开启的事务
set autocommit = 0;
#开始事务
insert 。。。
update 。。。
#多条SQL语句
commit 或者 rollback 都会关闭事物;

commit提交事务,rollback回滚,也就是什么都不执行;

案例1: 在autocommit=ON的情况下,需要手动开启一个事务,以commit或者rollback提交事务;

image.png

我们开启一个事务,把表删除,查询为空,rollback回滚,事务结束,再次查询发现数据还在; 注意: :数据定义语句不适用于rollback,因为他们会立即进行执行,只有数据操纵语句能rollback;commit之后会永久生效;

2.使用保留点

如果事务中的SQL语句很多,我们只需要部分回退,可以使用rollback to savepoint会退到声明savepoint的地方。

案例2:

image.png

3.事务的隔离性

image.png 事务与事务之间的执行应当相互隔离,不能相互干扰,查看未提交的数据;其中写和写的隔离使用锁的机制来实现,读和写的隔离使用MVCC实现:

image.png

3.1脏读

image.png 事务A读取到事务B还没有提交的数据;

3.2 不可重复读

image.png 事务A读取两次数据,在两次的间隔中,事务B更新了数据,造成两次读取不一致的问题;

3.3 幻读

image.png 事务A对同一集合数据进行两次读取,在读取之间,事务B增加或者删除了数据,A事务的两次读取得到不一样的行数据;

3.4 隔离级别

image.png 隔离性通过不同的隔离级别来实现,这些级别定义了事务之间可以观察到的并发操作的可见性; 可通过命令 set transaction_isolation= 'xxx';来设置隔离的级别,级别越高,隔离度也越高,并发性能会很低,需要考虑实际的应用场景具体判断;

  1. 读未提交:在这个级别上,事务可以读取到其他未提交事务的更改,会导致脏读
  2. 读已提交:只能读取到其他事物已经提交的更改;可以避免脏读,但不可避免不可重复读的问题
  3. 可重复读:事务可以看到一致的数据,但不能避免幻读;
  4. 串行化:最高的隔离级别,事务依次顺序执行,提供了最严格的隔离,但可能会严重影响性能;