InnoDB事务机制
Mysql中事务支持在引擎层实现
事务的特性:原子性,一致性,隔离性,持久性
事务就是保证一组数据库操作,要么全部成功,要么全部失败。
事务隔离级别:
1、读未提交:一个事务还没提交时,做的修改可以被其他事务看到
2、读提交:一个事物提交之后,做的修改才可以被其他事务看到
3、可重复读:一个事物执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。在可重复读隔离级别下,未提交变更对其他事务也是不可见的
4、串行化:对于同一行记录,写的时候加写锁,读的时候加读锁,当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行
在实现上,数据库会创建一个视图,访问的时候以视图的逻辑结果为准
读未提交:直接返回记录上的最新值
读已提交:每个SQL语句执行前都会创建一个新的视图
可重复读:视图在事务启动的时候创建,事务提交前的所有操作都在使用这个视图
可串行化:使用加锁的方式避免并行访问
可重复读使用场景:(一个事务执行过程中看到的数据,总是和事务在启动的时候看到的数据一致)账户管理,一张表存了账户余额,另一张表保存了账单详细,到了月底做数据校对,即使在校对期间发生新的交易,也不会影响校对结果。
事务隔离具体怎么实现:每条记录在更新的时候都会同时记录一条回滚操作,同一条记录在系统中可能存在多个版本,这就是数据库的多版本并发控制(MVCC)
回滚日志什么时候删除?
系统会判断当前有没有事务需要用到这些回滚日志,如果没有,就会删除
什么时候不需要这些回滚日志:
当系统中不存在比这个回滚日志更早的read-view【视图】的时候
为什么不建议使用长事务?
长事务意味着系统中保存着更多的事务视图,在这个事务提交之前,回滚记录必须保留,导致占用大量存储空间。在Mysql5.5版本的时候,回滚日志和数据字典一起存放在ibddata文件里,事务提交,回滚段会被清理,但是可能造成文件较大,需要重建数据库,另外长事务还会占用锁资源。
在information_sche
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java全新整理八股文 + 场景题 + 算法 精心设计,面试命中率超过80% 专栏优势: 1、问题和答案已经整理到位,答案更专业,可以直接回答,不需要额外总结! 2、场景题讲解清晰,适用于大部分场景的项目,并且持续更新中 3、分享学习心得【知识点的广度和深度,算法有哪些坑,如何准备面试等等】