背景
这几天看数据库可串行化的实现方式,提到了乐观的快照隔离算法,和悲观的俩阶段加锁,回忆之前的多线程编程,想写一篇悲观和乐观在计算机领域的逻辑。
悲观者永远正确
“悲观者永远正确。我宁愿什么也不做,也不愿犯错。” 在系统设计中,不做任何有风险的事情。在多线程中,如果有人在使用临界区的数据,那么无论他是否改变我需要的数据(是否有真的冲突),我都不能执行;在数据库的可串行化实现中,如果有事务正在使用我需要的数据,我直接放弃我的查询,进行等待。
乐观者永远前行
期望所有事情都朝好的方向发展,并且依据这个期望做出决策。但是在计算机领域,这个乐观决策也不一定会落实,你需要把你的前提(期望)也提交给系统,让系统判断你的决策是否该执行。多线程编程中CAS操作,如果它的预期值和该CAS操作的预期值不符,那么这个操作也不会执行;可串行化的隔离级别,如果有潜在冲突的可能,事务也会继续执行,只有在事务提交的时候,数据库系统会判断是否真的冲突,如果有真的冲突则中止事务。
一般情况下乐观操作被系统检查到冲突中止后,会让系统重试该操作,如果事实冲突很多,那么不断的重试,会增加系统压力,降低系统性能。