Mysql事务原理
2023-03-27 22:37:38 0 举报
AI智能生成
Mysql事务原理
作者其他创作
大纲/内容
概述
事务是一系列操作的集合,要么全部成功,要么全部失败,目的是为了保证数据最终的一致性
ACID四个特性
原子性(Atomicity)
当前事务的操作要么同时成功,要么同时失败。原子性由 undo log日志来实现。
一致性(Consistent)
使用事务的最终目的,由其它3个特性以及业务代码正确逻 辑来实现。
隔离性(Isolation)
在事务并发执行时,他们内部的操作不能互相干扰。隔离性由 MySQL的各种锁以及MVCC机制来实现。
- 持久性(Durable)
一旦提交了事务,它对数据库的改变就应该是永久性的。持久性由redo log日志来实现。
持久性由redo log 日志来保证,当我们要修改数据时,MySQL是先把这条记录所在的「页」找到,然后把该页加载到内存中,将对应记录进行修改
为了防止内存修改完了,MySQL就挂掉了(如果内存改完,直接挂掉,那这次的修改相当于就丢失了)
MySQL引入了redo log,Buffer Pool内存写完了,然后会写一份redo log,这份redo log记载着这次在某个页上做了什么修改
即便MySQL在中途挂了,可以根据redo log来对数据进行恢复
redo log 是顺序写的,写入速度很快。并且它记录的是物理修改(xxxx页做了xxx修改),文件的体积很小,恢复速度也很快
实现方式
InnoDB存储引擎
锁机制
读锁(共享锁、S锁):select ... lock in share mode;
读锁是共享的,多个事务可以同时读取同一个资源,但不允许其他事务修改
读锁是共享的,多个事务可以同时读取同一个资源,但不允许其他事务修改
写锁(排它锁、X锁):select... for update;
写锁是排他的,会阻塞其他的写锁和读锁,update、delete、insert 都会加锁
写锁是排他的,会阻塞其他的写锁和读锁,update、delete、insert 都会加锁
MVCC
MVCC(multi-version concurrency control)多版本并发控制
select操作是快照读(历史版本)
insert、update和delete是当前读(当前版本)
read commit(读已提交),语句级快照
repeatable red (可重复读),事务级快照
redolog和undolog
innoDB事务隔离级别
读未提交(Read-Uncommitted)
读已提交(Read-Committed)
可重复读(Repeatable-Read)默认
串行化(Serializable)
事务并发问题
更新丢失(Lost Update)或脏写
脏读(DirtyRead)
不可重复读(Non-RepeatableRead)
幻读(PhantomRead)
大事务影响
并发情况下,数据库连接池容易被撑爆
锁定太多的数据,造成大量的阻塞和锁超时
执行时间长,容易造成主从延迟
回滚所需要的时间比较长
undo log膨胀
容易导致死锁
事务优化
将查询等数据准备操作放到事务外
事务中避免远程调用,远程调用要设置超时,防止事务等待时间太久
事务中避免一次性处理太多数据,可以拆分成多个事务分次处理
更新等涉及加锁的操作尽可能放在事务靠后的位置
能异步处理的尽量异步处理
应用侧(业务代码)保证数据一致性,非事务执行
try{}catch()
简单说捕获异常 在catch回滚 也有可能会出现catch里面嵌套catch~
try{}catch()
简单说捕获异常 在catch回滚 也有可能会出现catch里面嵌套catch~
事务的启动、提交和回滚
启动事务
提交事务
回滚事务
事务日志
redolog
子主题
undolog
事务的应用
保证数据的一致性
提高数据的并发性
保证数据的完整性和安全性
总结
事务是一种重要的机制,保证了数据的一致性和完整性
需要根据实际情况选择合适的隔离级别
需要注意事务并发问题,如脏读、不可重复读、幻读
事务日志是保证事务的重要手段
0 条评论
下一页