乐趣区

关于mysql:MySQL学习笔记2事务

I、基本概念

事务保障一组数据库操作,要么全副胜利,要么全副失败。
事务在引擎层实现(InnoDB 反对,MyISAM 不反对)。
事务个性:原子性、一致性、隔离性、持久性。

个性 体现
原子性 一个事务(transaction)中的所有操作,或者全副实现,或者全副不实现,不会完结在两头某个环节。事务在执行过程中产生谬误,会被回滚(Rollback)到事务开始前的状态,就像这个事务素来没有执行过一样。即,事务不可分割、不可约简。
一致性 在事务开始之前和事务完结当前,数据库的完整性没有被毁坏。这示意写入的材料必须完全符合所有的预设束缚、触发器、级联回滚等。
隔离性 数据库容许多个并发事务同时对其数据进行读写和批改的能力,隔离性能够避免多个事务并发执行时因为穿插执行而导致数据的不统一。事务隔离分为不同级别,包含未提交读(Read uncommitted)、提交读(read committed)、可反复读(repeatable read)和串行化(Serializable)
持久性 事务处理完结后,对数据的批改就是永恒的,即使系统故障也不会失落。

II、启动和回收

1、长事务带来的问题
—因为须要生成大量的 undolog, 所以占用大量的存储空间,其事务回滚工夫长
—锁定数据过多,容易造成大量的死锁和锁超时
2、怎么实现
—显式启动事务语句,begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。
—set autocommit=0。

START TRANSACTION 后,不论 autocommit 是 1 还是 0。只有当 commit 数据才会失效,ROLLBACK 后就会回滚。2、当 autocommit 为 0 时,不论有没有 START TRANSACTION。只有当 commit 数据才会失效,ROLLBACK 后就会回滚。3、如果 autocommit 为 1,并且没有 START TRANSACTION。会主动 commit。调用 ROLLBACK 是没有用的。即使设置了 SAVEPOINT。

III、隔离级别

1、解决什么问题:多事务并行时呈现的脏读(dirty read)、不可反复读(non-repeatable read)、幻读(phantom read)。

概念 体现 起因 产生的隔离级别
脏读 读到其余事务未提交的数据 当数据库中一个事务 A 正在批改一个数据然而还未提交或者回滚,另一个事务 B 来读取了批改后的内容并且应用了,之后事务 A 提交了,此时就引起了脏读。 读未提交
不可反复读 前后读取的记录内容不统一 在一个事务 A 中屡次操作数据,在事务操作过程中(未最终提交),事务 B 也才做了解决,并且该值产生了扭转,这时候就会导致 A 在事务操作的时候,发现数据与第一次不一样了,就是不可反复读。 读未提交、读提交
幻读 前后读取的记录数量不统一 一个事务按雷同的查问条件从新读取以前检索过的数据,却发现其余事务插入了满足其查问条件的新数据,这种景象就称为幻读。 读未提交、读提交、可反复读

2、隔离级别的定义(级别由低到高):

定义 体现 了解
读未提交 一个事务还没提交时,它做的变更就能被别的事务看到 他人改数据的事务尚未提交,我在我的事务中也能读到
读已提交 一个事务提交之后,它做的变更才会被其余事务看到 他人改数据的事务曾经提交,我在我的事务中能力读到
可反复读 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是统一的 他人改数据的事务曾经提交,我在我的事务中也不去读
串行 对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当呈现读写锁抵触的时候,后拜访的事务必须等前一个事务执行实现,能力继续执行 我的事务尚未提交,他人就别想改数据

3、参数
设置:transaction-isolation
查问:show variables like ‘transaction_isolation’;
4、怎么实现
MVCC:多版本并发管制,通过 undo log 版本链和 read-view 实现事务隔离
在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都能够失去前一个状态的值。意思就是除了记录变更记录,还会记录一条变更相同的回滚操作记录,前者记录在 redo log,后者记录在 undo log。

IV、下一步须要理解的货色

数据库视图
undo log

退出移动版