MySQL进阶--MySQL事务详解

事务详解

(一)事务概述

一组有序的增删改操作,看做一个独立的执行单元,这个独立的执行单元就是事物

银行转账: 怎么才算转账成功

​ A给B转账

​ 1.先更新A账户的余额信息 更新语句

​ 2.更新B账户的余额信息 更新语句

特点: 一个事物中,只要有一个操作失败,整个事物就回滚,所做操作都不生效

作用: 为了保障数据的安全

(二)数据库引擎

数据库存储引擎,是数据库底层构建的核心,负责底层数据持久化和软件交互的序列化操作、校验过程以及交互过程,通过数据库存储引擎完成创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。

(1) InnoDB

InnoDB是事务型数据库的首选引擎,支持事务支持行锁定和外键

存储分两个文件存储: 一个文件存表结构,一个文件存索引和数据

(2) MyISAM

在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但****不支持事物****,不支持外键

将数据存储在三个文件中:一个存结构 一个存索引 一个存数据

(三)事务的特性

事务在操作过程中,为了保障批量数据在批量操作过程中的数据安全性,制定了一些事务本身必须具备的特性,通过对这些特性约束的具体实现,保障事务执行的安全性和可靠性;这些特性被统称为ACID特性,分别为

• 原子性(atomicity)

• 一致性(consistency)

• 隔离性(isolation)

• 持久性(durability)

原子性:要么都成功 要么都失败,失败后操作回滚,不会对数据库的数据造成影响

​ 事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。如A给B转帐,不会出现A的钱少了,B的钱却没有增加的情况。

一致性: 事务开始前和结束后数据库的状态保持一致,数据库的完整性约束没有被破坏 。如转账业务完成后A减少100,B一定增加100

持久性:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

隔离性:当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事物之间要相互隔离互不影响

(四)事务的并发问题

脏读(dirty read):A事务读取B事务尚未提交的更改数据,并在这个数据基础上操作。如果B事务回滚,那么A事务读到的数据根本不是合法的,称为脏读。

不可重复读(unrepeatable read): A事务读取了一条数据B事务已经提交的更改数据 。假设A在取款事务的过程中,B往该账户转账100元,A两次读取账户的余额发生不一致:

幻读(phantom read): A事物读取了多条数据,并做了计算,此时B事物新添加了一条数据,导致我们计算的结果出现了偏差。

A事务读取B事务提交的新增数据,这时A事务将出现幻象读的问题。幻象读一般发生在计算统计数据的事务中,举一个例子,假设银行系统在同一个事务中,两次统计存款账户的总金额,在两次统计过程中,刚好新增了一个存款账户,并存入100元,这时,两次统计的总金额将不一致

(五)事务隔离级别

SQL标准化结合实际操作过程中的数据表现,定义了4类隔离级别,制定了一些具体规则用来限定事务内外的哪些改变是可见的,哪些是不可见的。

(1) Read Uncommitted(读未提交)

一个事务不能修改其他事务正在修改的数据,但可以读取到其他事务中尚未提交的修改,这些修改如果未被提交,将会成为脏数据,

(2) Read committed(读已提交)

只允许读取已经被提交的数据,防止脏读发生。

(3) Repeat Read(可重复读)

这一级别下,不允许事务读取在该事务开始后新提交的数据。即防止了不可重复读的发生。

(4) Serializable(可串行化)

所有的事务必须串行化执行,只要有事务在对表进行查询,那么在此事务提交前,任何其他事务的修改都会被阻塞。

(六)事务操作

MySQL终端,可以通过DBMS命令将事务行为发送至对应的DB完成事务的最终执行。

-- 设置事物隔离级别
set sessiion transaction isolation  level  隔离级别

-- 开启一个事物
start transaction;

-- 提交事物
commiit;

-- 事物回滚
rollback;

(1)案例操作:读未提交与脏读*

MySQL进阶--MySQL事务详解_第1张图片

上述操作中,终端1中的事务A并没有提交的情况下,insert的数据,在终端2的事务B中读取到了,此种情况下如果事务A进行了事务回滚,事务B重新执行语句就会发现数据又消失了,这就是第一种读未提交模式下出现的数据脏读的典型示例,如下图所示:
MySQL进阶--MySQL事务详解_第2张图片

你可能感兴趣的:(MySql,基础和进阶,数据库,mysql,编程语言,python)