MySQL事务

事务简介:一组操作集合,是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,这些操作要么同时成功,要么同时失败。

事务四大特性:

(1)原子性:事务不可分割,是最小操作单元,事务的所有操作要么同时成功,要么同时失败

(2)一致性:事务完成时,必须使所有数据保持一致状态

(3)隔离性:数据库提供的隔离机制,保证事务在不受外部并发操作影响的环境下运行

(4)持久性:事务一旦提交或回滚,他对数据库中的数据改变就是永久的

并发事务问题:
(1)脏读:一个事务读到另一个事务还没有提交的数据。

(2)不可重复度:一个事物先后读取同一条记录,但两次读取的数据不同

(3)幻读:一个事物按照条件查询数据,没有对应的数据行,但在插入是,又发现这行数据已经存在。

事务隔离级别:

(1)Read uncommitted:上述三个问题同时存在。

(2)Read committed:解决脏读。

(3)Repeatable Read:解决脏读和不可重复读。

(4)Serializable:解决上述所有问题。

事务隔离级别越高,数据越安全,但是性能越低。

事务原理:

原子性、一致性、持久化三个特性由两份日志保证,即redo log和undo log日志。

隔离性由数据库的锁和MVCC保证的。

(1)redo log,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。由redo log buffer和redo log file组成,前者在内存,后者在磁盘中,事务提交后前者通过后台线程提交到后者,用于刷新脏页到磁盘,发生错误时,进行数据恢复使用

        undo log,回滚日志,用于记录数据被修改前的信息,作用:提供回滚(保证原子性)和MVCC(多版本并发控制)。undo log是逻辑日志,他记录操作的反操作,例如,当delete一条记录,它记录一条对应的insert。

(2)MVCC(multi-version concurrency control),多版本并发控制,维护一个数据的多个版本,作用是让读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC具体实现,依赖于三个隐式字段、undo log、readView。

a.隐式字段,表结构的隐藏字段,

        DB_TRX_ID:最近修改的事务ID、

        DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,回滚链、

        DB_ROW_ID:隐藏主键,若没有指定主键,生成该隐藏字段

b.undo log

c.Read View:包含四个核心字段

        m_ids:当前活跃的事务ID集合

        min_trx_id:最小活跃事务ID

        max_trx_id:预分配事务ID,当前最大事务ID+1

        creator_trx_id:ReadView创建者的事务ID

根据这四个字段规定版本链数据的访问规则,不同的隔离级别,生成Read View的时机不同

RC:事务中每一次执行快照读时生成ReadView

RR:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值