mysql-数据库事务(ACID)

mysql-数据库事务

提示:内含脏读、幻读、不可重复度、



事务的使用场景

官方解释:

MySQL 事务主要用于处理操作量大,复杂度高的数据

白话版:

事务就是解决在操作多条数据时,防止因某些错误原因导致数据表中出现垃圾数据的解决方案

使用场景:

  1. 情景:转账
    积分转账:积分表,A用户向B用户转账300积分;
    流程:减少A用户的300积分→为B用户增加300积分;
    此时A用户减少积分成功,B用户增加积分失败,此时数据就出现了错误,A用户凭空消失了300积分
    此时就需要事务,当因为发生某些错误时,事务会自动回滚来保证我们数据的一致性;
  2. 情景:删除用户
    假设删除A用户需要删除A用户在用户表、邮箱表、电话表中的数据;
    流程:在用户表中找到A用户执行删除→在邮箱表中找到A用户的信息执行删除→在电话表中找到A用户执行删除;
    此时因为操作某张表时发生了某种错误,导致值删除了用户表与邮箱表中A用户的数据,电话表未被操作,此时就出现了垃圾数据;
    如果使用事务进行管理,就可以保证数据修改前后的一致性;

事务的4个特性(ACID)

原子性(Atomicity)

官方版: 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

白话版: 用事务操作数据只有2个结果,要么都操作成功,要么操作失败;

一致性(Consistency)

官方版: 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

白话版: 事务成功,数据和我们需要的保持一致;事务失败就把数据给我恢复成原来的样子;
一致性是事务的核心

隔离性(Isolation)

InnoDB事务隔离级别手册地址:https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html

官方版: 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

白话版: 主要通过4种隔离级别防止脏读、幻读、不可重复读情况的出现,核心目的也是为了保证数据的一致性!

持久性(Durability)

官方版: 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

白话版: 一旦事务处理结束落盘成功,不管你是断电宕机,我再重新开机的时候你就得把数据给我恢复;


脏读、幻读、不可重复读

核心都是读到了不符合预期的数据

脏读

定义:脏读是指事务读到了其他事务未提交的数据

前提:事务隔离级别设置为读未提焦(Read uncommitted)

例如:
B事务正在更新id=1的name值,还未提交
此时事务A来读取id=1的name值就是张老三
由于事务B因为某些原因导致了回滚
最后数据表中的数据仍然为张三
但事务A读取到的数据却是张老三
在这里插入图片描述

不可重复读

定义:并发更新时,其中一个事务前后两次查询相同的数据时与预期不符合;

前提:事务隔离级别为读未提交(read uncommitted)读已提交(read committed)

例如:
事务A查询id=1的余额为100
然后进行其他业务逻辑的处理
事务B此时又对id=1的余额进行了修改,并提交了事务;
此时事务A刚好处理完其他业务逻辑;
事务A又对id=1的余额进行了查询,发现此时余额=300这和预期的值不符合!
在这里插入图片描述

幻读

定义:指并发指新增、删除这种或产生数量变化的操作是,另一个事务查询相同的数据与预期不符合;

例如:
A事务执行统计用户表总数;
B事务执行新增一条用户数据;
B事务提交;
A事务再次执行统计用户表数量;
此时A事务前后两次查询出的数据就与预期不符合;
在这里插入图片描述


事务隔离级别

用处:

为了解决上述脏读、不可重复读、幻读的问题,mysql有4种事务隔离级别来应对

隔离级别对照表(隔离等级从低到高升序)

隔离级别脏读可能性不可重复读幻读加锁读
读未提交
读已提交
可重复读是(innodb除外)
串行化

并发处理能力从低到高降序

mysql默认隔离级别为可重复读


如何设置隔离级别

详见MYSQL官方手册:https://dev.mysql.com/doc/refman/8.0/en/set-transaction.html
示例:设置隔离级别为可重复读

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;#设置隔离级别为REPEATABLE READ(可重复读)
select @@transaction_isolation;#查看隔离级别(方法1)
#show variables like 'transaction_isolation';#查看隔离级别(方法2)

如何使用事务

BEGIN;#开启事务
UPDATE users SET wallet=50 WHERE id = 1;#将id=1的用户中的50积分转给id=2的用户
UPDATE users SET wallet=200 WHERE id = 2;
COMMIT;#提交事务

END;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值