《mysql学习》-- 事务

mysql

事务

1、事务的特性

ACID
有效的减少io次数可以明显提高数据库性能,当不开启事务的事务,每执行一条语句都当做一个事务,都会发生一次io,如果开启事务,将一个事务中所有的sql执行会首先在内存中执行,然后事务提交后开启一次io根据事务日志同步到磁盘。

事务日志

参考:MySQL事务提交过程(一)
1. 重做日志:
2. 撤销日志:
事务日志可以帮助提高事务的效率,存储引擎在修改表的数据时只需要修改你内存拷贝,再把修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据持久到磁盘。事务日志采用的是追加的方式,因此写日志的操作时磁盘上一小块区域内的顺序IO,所以采用事务日志的方式相对来说快很多。事务日志持久后,内存中修改的数据在后台可以慢慢的刷回磁盘,修改数据需要写两次磁盘。如果修改的数据已经记录到事务日志并持久化,即使数据本身还没有写回磁盘,操作系统崩溃了,存储引擎在重启时能够自动回复这部分数据
MySQL 本身不提供事务支持,而是开放了存储引擎接口,由具体的存储引擎来实现,具体来说支持 MySQL 事务的存储引擎就是 InnoDB。存储引擎实现事务的通用方式是基于 redo log 和 undo log。
简单来说,redo log 记录事务修改后的数据, undo log 记录事务前的原始数据。所以当一个事务执行时实际发生过程简化描述如下:
1. 先记录 undo/redo log,确保日志刷到磁盘上持久存储。
2. 更新数据记录,缓存操作并异步刷盘。
3. 提交事务,在 redo log 中写入 commit 记录。
事务一定要保证日志先落盘,才能算事务提交完成,提交过程中,主要做了4件事情,
1. 清理undo段信息,对于innodb存储引擎的更新操作来说,undo段需要purge,这里的purge主要职能是,真正删除物理记录。在执行delete或update操作时,实际旧记录没有真正删除,只是在记录上打了一个标记,而是在事务提交后,purge线程真正删除,释放物理页空间。因此,提交过程中会将undo信息加入purge列表,供purge线程处理。
2. 释放锁资源,mysql通过锁互斥机制保证不同事务不同时操作一条记录,事务执行后才会真正释放所有锁资源,并唤醒等待其锁资源的其他事务;
3. 刷redo日志,前面我们说到,mysql实现事务一致性和持久性的机制。通过redo日志落盘操作,保证了即使修改的数据页没有即使更新到磁盘,只要日志是完成了,就能保证数据库的完整性和一致性;
4. 清理保存点列表,每个语句实际都会有一个savepoint(保存点),保存点作用是为了可以回滚到事务的任何一个语句执行前的状态,由于事务都已经提交了,所以保存点列表可以被清理了。

事务状态

  1. 活动的
  2. 部分提交的:部分数据已同步到磁盘上,但是没全部写入
  3. 失败的:事务提交了,但是提交失败
  4. 终止的:失败后终止了事务
  5. 提交的:事务一旦提交无法撤销,只能通过补偿事务来完成

事务并发执行

1、提高吞吐量和资源利用率
2、减少等待时间

事务调度

  1. 可恢复调度:两个事务交叉执行都不会导致另外一个事务状态改变
  2. 无级联调度:

并发控制技术手段

  1. 锁:
  2. 时间戳:
  3. 多版本和快照隔离:

事务隔离级别

参考:深入分析事务的隔离级别

  1. Read uncommitted:更新时对修改行的数据添加行级共享锁。
  2. Read committed:读取时对读取的数据添加行级共享锁,一旦读完立即释放更新时对修改行的数据添加行级排他锁,直到事务结束释放
  3. Repeatable reads:读取时对读取的数据添加行级共享锁,直到事务结束释放更新时对修改行的数据添加行级排他锁,直到事务结束释放
  4. Serializable:读取时添加加表级共享锁,直到事务结束才释放更新时添加表级排他锁,直到事务结束才释放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值