MySQL事务(ACID四大特性/隔离级别)
2021-02-26 15:22:03 0 举报
AI智能生成
MySQL事务(ACID四大特性/隔离级别)
作者其他创作
大纲/内容
喜欢收藏+点赞👍 谢谢
事务四大特性ACID
原子性Atomicity
要么都成功,要么都失败,一个事务内的所有sql语句要保持同步的进行
实现原理:依靠undo.log日志,记录事务执行的sql,在事务失败时进行反向补偿,回滚数据
一致性Consistency
事务前后总量不变,数据库的完整性约束没有被破坏
实现原理
从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性
从应用层面,通过代码判断数据库数据是否有效,然后决定回滚还是提交数据
隔离性Isolation
一个事务的执行不被其他事务干扰
写-写操作
通过锁来实现
写-读操作
MVCC
持久性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 条评论
回复 删除
下一页