MySQL事务(ACID四大特性/隔离级别)
2021-02-26 15:22:03 0 举报
AI智能生成
MySQL事务(ACID四大特性/隔离级别)
作者其他创作
大纲/内容
事务四大特性ACID
原子性
Atomicity
Atomicity
要么都成功,要么都失败,一个事务内的所有sql语句要保持同步的进行
实现原理:依靠undo.log日志,记录事务执行的sql,在事务失败时进行反向补偿,回滚数据
一致性
Consistency
Consistency
事务前后总量不变,数据库的完整性约束没有被破坏
实现原理
从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性
从应用层面,通过代码判断数据库数据是否有效,然后决定回滚还是提交数据
隔离性
Isolation
Isolation
一个事务的执行不被其他事务干扰
实现原理
写-写操作
通过锁来实现
写-读操作
MVCC
持久性
Durability
Durability
事务一旦提交,结果便是永久性的
实现原理
主要依靠redo.log日志实现,在执行修改操作时,sql会先写入到redo.log日志,
再写入缓存,最后更新数据库,这样即使断电,也能保证数据库不丢失数据
再写入缓存,最后更新数据库,这样即使断电,也能保证数据库不丢失数据
Innodb_flush_log_at_trx_commit
扩展
如果在commit前将内存中的数据写入到磁盘会有什么问题?
采用redo log的好处?
并发事务带来的问题
脏写/丢失更新
A事务提交或者撤销时,把B事务更新的数据给覆盖了
解决方案
悲观锁
select xx for update;
严重影响并发,不推荐
乐观锁
获取数据时不加锁,update时再去检查冲突
可使用版本号或者时间戳来判断是否修改过
读一致性
脏读:读到其他事务未提交的数据
不可重复读:读到其他事务已经提交的数据,导致两次查询的结果不同
幻读:读到其他事务已提交的数据行
不可重复读和幻读的区别?
前者读的是其他事务修改或删除的数据
而幻读读到的是其它事务新插入的数据
而幻读读到的是其它事务新插入的数据
隔离级别
读未提交 READ UNCOMMITTED:解决了脏写,会出现脏读
读已提交 READ COMMITTED:解决了脏读,但会出现不可重复读
可重复读 REPEATABLE READ:解决了不可重复读,但会出现幻读(InnoDB不会,默认隔离级别)
串行化 SERIALIZABLE:使用表锁,降低并发性能
0 条评论
下一页