mysql学习笔记-事务基础知识
1、各存储引擎事务支持情况
只有InnoDB支持事务
2、事务的ACID特性
2.1原子性(atomicity)
不可分割的工作单位,要么全部提交,要么全部失败回滚。
2.2 一致性(consistency)
数据从一种合法的状态转换为另一种合法的状态,在特定的业务逻辑下完成这种转变。
当两种状态一致时则遵循一致性原则;如果出现不一致的情况则会导致一致性要求被违反。
举例1、A向B转账后会创建一个新的交易记录该记录会记录资金流动情况从而保证A和B账户内的总金额保持不变如果不满足这一条件就会违反一致性原则。
举例2、在数据库设计中我们通常会在表中定义字段属性来约束数据的行为例如将"姓名"字段设置为唯一性约束这一设定确保在任何情况下都不会出现重复的姓名值从而保障事务处理的一致性要求即使发生回滚操作也不会影响数据的一致性。
2.3、隔离型(isolation)
事务的隔离性指的是其执行不会受到其他并发操作的影响。具体而言,在同一时间点内,
一个事务内部的操作及其所使用的数据仅针对与之关联的对象进行隔离,
而与其他正在并行执行的不同事务之间能够保持独立且互不影响。
这一机制类似于Java中多线程机制下的各线程相互独立且互不影响。
事物之间的相互排斥性体现在它们无法在同一个空间或时间内与其他事物产生影响或相互作用,
即每一种事物在其存在的过程中都保持自身特有的性质不受外部因素干预,
而与其他事物间则保持独立性以确保系统的稳定性与可靠性。
这种特性类似于生物生态学中的物种间竞争排斥原理。

2.4、持久性(durability)
持久性是指一个事务一旦被提交后,在数据库中对数据所作的变更具有 持久性 特征,在后续的操作以及可能出现的系统故障情况下都不会产生影响。ACID 是事务管理系统的四大基本特性,在这四个特性中,默认情况下原子性是实现的基础保障条件、隔离性则是维护系统稳定的重要工具、一致性则为系统的运行提供了基本约束条件;而持久性则是系统设计者为了保证数据可靠性而设定的核心目标。
3、事务的状态
3.1、正在进行中的活动
3.2、尚未完全提交的部分
3.3、未能成功完成的任务
3.4、被终止的过程
3.5、已完成提交的内容
3、如何使用事务
步骤1: 执行事务操作
步骤2: 进行多个DML操作
步骤3: 当事务完成时,其状态可能为提交状态(COMMIT)或中止状态(ROLLBACK)
3.1.显式事务
开启方式:通过关键字:start transaction或begin。 start transaction后可跟随:读-only模式 / 读写模式(默认)/ 带一致快照的模式。 savepoint(保存点)。
开启方式:通过关键字:start transaction或begin。 start transaction后可跟随:读-only模式 / 读写模式(默认)/ 带一致快照的模式。 savepoint(保存点)。
3.2、隐式事务
关键字:autocommit
set autocommit = false;
SHOW VARIABLES LIKE ‘autocommit’;#默认是ON
UPDATE account SEr balance=balance-10 WHERE id=1;#此时这条DML操作是一个独立的事务UPDATE account sET balance=balance+10 WHERE id=2;#此时这条DML操作是一个独立的事务
如果关闭自动提交?
SET autocommit= FALSE;#针对于DML操作是有效的,对DDL操作是无效的
UPDATE account sEr balance=balance-10 WHERE id = 1;
UPDATE account sEr balance=balance +10 wHRE id=2;
COMMIT;#或rollback;
#方式2:我们在autocommit为true的情况下,使用ftart transaction 或begin开启事务,那么D操作就不会自动提交数据
3.3、隐式提交数据的情况
①数据定义语言(Data definition language,缩写为:DDL)
数据库对象,指的就是 数据库 、 表、 视图、存储过程 等结构。当我们使用 CREATE、 ALTER、 DROP 等语句去修改数据库对象时,就会隐式的提交前边语句所属于的事务。即:
BEGIN;
SELECT …#事务中的一条语句
UPDATE …# 事务中的一条语句
…·# 事务中的其它语句
CREATE TABLE…#此语句会隐式的提交前边语句所属于的事务
②隐式使用或修改mysql数据库中的表
当我们使用ALTER USER、CREATE USER、 DROP USER、 GRANT、 RENAME USER、 REVOKE、 SETPASSWORD 等语句时也会隐式的提交前边语句所属于的事务。
③事务控制或关于锁定的语句
当我们在一个事务还没提交或者回滚时就又使用 START TRANSACTION 或者 BEGIN 语句开启了另一个事务时,会 隐式的提交 上一个事务。即:
BEGIN;
SELECT...#事务中的一条语句
UPDATE ...# 事务中的一条语句
#事务中的其它语句
4、事务的分类
扁平事务:最基本的形式,在所有操作均处在同一层级的情况下进行一次性执行或直接回滚。
带有时 checkpoints 的扁平事务可在运行中回滚至更早的状态。
链式事务由多个子事务以序列方式构成,在提交时可释放不再需要的数据对象并将其处理逻辑传递给下一个子事务。
在分布式系统环境中运行的事务涉及多节点对共享数据库资源的操作。
5、事务隔离级别
5.1、数据并发问题
1、脏写(Dirty Write)
对于两个事务 Session A、Session B,如果事务SessionA修改了另一个未提交 事务SessionB修改过的数据,那就意味着发生了脏写
2、脏读(Dirty Read )
对于两个事务 Session A、Session B,SessionA 读取 了已经被 SessionB 更新 但还 没有被提交 的字段。之后若Session B 回滚,Session A读取 的内容就是 临时且无效的。
3.不可重复读(Non-Repeatable Read )
对于两个事务Session A、Session B,SessionA 读取了一个字段,然后 SessionB更新 了该字段。之后Session A再次读取 同一个字段,值就不同了。那就意味着发生了不可重复读。
4.幻读(Phantom)
对于两个事务Session A、Session B,sessionA从一个表中 读取 了一个字段,然后 Sessio B 在该表中 插入 了一些新的行。之后,如果 Session A 再次读取 同一个表,就会多出几行。那就意味着发生了幻读。
5.2、SOL中的四种隔离级别
1、READ UNCOMMITTED:读未提交
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读。
2、READ COMMITTED 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读。
3、REPEATABLE READ:可重复读,事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事.务A再读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍然存在。这是MySQL的默认隔离级别。
4、SERIALIZABLE:可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免,但性能十分低下。能避免脏读、不可重复读和幻读。
脏写 怎么没涉及到?因为脏写这个问题太严重了,不论是哪种隔离级别,都不允许脏写的情况发生。
如何查看mysql隔离级别
show variables like ‘transaction isolation’;
