您现在的位置是:首页 >学无止境 >【MySql】数据库事务网站首页学无止境

【MySql】数据库事务

小小孩~ 2024-06-17 10:19:31
简介【MySql】数据库事务

事务

事物本质上指一条 sql 语句或一组 sql 组合

事务的特性:ACID

1、原子性:一个事务,要么一次性完成,要么就不做
2、一致性:事务以前及事务以后,数据库完整性不会被破坏,符合所有预设规则
3、隔离性:事务之间相互隔离,防止多个事务并发执行时由于交叉执行而导致数据不一致
4、持久性:事务处理之后,对数据的修改是永久性的,即便系统故障也不会丢失

在这里插入图片描述

事务的操作

开始事务:begin; / start transaction;
提交事务:commit;
保存事务节点:savepoint point_name;
事务回滚:rollback; 全部回滚 / rollback to point_name; 回滚到某一个事务点

一旦事务进行中,客户端发生异常,为了维护原子性,则会时候就会自动进行数据库回滚;
一旦事务进行了提交 commit ,则这时候对数据库的修改就是永久性的

事务并发处理可能出现的问题

1、脏读:
事务 A 读取到了事务 B 并未提交前所作的修改;

在这里插入图片描述

2、不可重复读:
一个事务在不同的时间段读取到的数据不一致(读取到的数据是未进行提交的数据)

在这里插入图片描述

3、幻读:
一个事务在不同时刻,读取到的数据条码数量不一致

在这里插入图片描述

隔离级别

读未提交:
所有事务可以看到其他事务没有提交的执行结果。但相当于没有任何隔离性,也会有很多并发问题:脏读、幻读、不可重复读等

读提交:
大多数数据库默认的隔离级别(不是 MySql 默认的),满足了隔离的简单定义:一个事务只能看到其他的已经提交的事务所做的改变,会引起不可重复读-------即:一个事务执行时,若多次 select 可以得到不同的结果

可重复读:
MySql 默认的隔离级别,确保同一个事务,在执行中多次读到操作数据时,会看到同样的数据,解决了脏读和不可重复读,但会产生幻读

串行化:
事务的最高隔离级别,通过强制事务排序,使之不可能相互冲突从而解决了幻读问题。在每个读的数据行上加共享锁,但可能会导致超时和锁竞争
加锁串行化进行,可以解决所有问题

隔离级别如何实现:隔离,基本都是通过锁来实现的,不同的隔离级别,锁的使用是不同的。常见有:表锁、行锁、读锁、写锁、间隙锁GAP、Next-Key锁(GAP+行锁)等等。

(间隙锁:行级锁,加锁不仅仅针对所要操作的数据,还会对要操作的数据旁边的数据(范围根据查询范围进行控制)进行加锁------可以解决幻读问题)

MVCC:多版本并发控制

MVCC 是一种快照读,读取到的都是历史版本的数据(事务只能获取到事务版本低于自己当前事务版本(ID)的数据)

每一个事务启动后,数据库都会给事务分配一个事务 ID(不断增长的)

在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。