此文是阅读网上资料总结出来,若有不严谨之处,请指正。
关于事务,说到它的四大特性,我对于一致性与原子性总是有些疑问,以为它们是相同意义。实际上,一致性是保证数据库执行完事务前后状态都是正确的,符合约束的; 原子性是事务里面的操作要么全部成功要么全部失败。原子性保证一致性的因素。可以思考下要是操作都成功但是不符合约束,不符合实际场景,这算原子性吗?这样就可以区分原子性与一致性。
说到持久性,这个我是可以理解的,就是事务执行成功后即使数据库崩溃,更改还是存在。猜想是不是引擎存储了这些操作的日志,等重新启动引擎时就会按照日志按行进行对应的步骤。
最后剩下隔离性,这个知识点就比较多了。先要弄清楚隔离性的定义,就是多个事务并行时,各个事务不互相干扰。这时候就要讨论到隔离性的等级,分为读未提交,读已提交,重复读,串行化。 设置完这些等级,就可以避免事务并行出现的问题。
下面先说事务并行出现的问题:脏读,不可重复读,幻读;(有没有觉得这些词太相似,之前我都是搞混的)。
脏读:举个例子,事务A修改了一个数据,但是未提交,事务B就去读取,读取完,事务A未提交呀,就会回滚。事务B就会发现读取的数据并不存在。这里重点是未提交;(若数据库隔离等级设置读未提交,这样可能会出现读取到未提交的,设置未 读已提交,可解决此问题)
不可重复读:例子: 事务A 查询某行数据,刚开始发现是100,事务b恰好修改这一行数据后提交,事务A再去查询发现数据变化。 (若数据库设置为可重复读可解决脏读以及不可重复读的问题,但是解决不了幻读)
幻读:例子:事务a进行一定范围的查询,例如查询年龄为xx的学生数目,事务B此时又插入一些记录并提交,事务a再次查询时发现发现数目有变化。(串行化可解决脏读,幻读,不可重复读).
不可重复读与幻读容易让人弄混。不可重复读是修改同一行记录 而幻读是一定范围的记录。为了解决这2个问题,我猜想,可以让锁行,跟锁范围来解决?我后续再弄清 他们的底层原理。