我一直在尝试理解这些类型的数据库事务。根据我的理解,快照事务通过发送相对较少的时间较旧的数据库快照来保持并发。当有许多调用时,悲观会阻塞事务的操作,其中乐观允许您在没有锁的情况下调用多个数据库调用。我对这些的理解正确吗?快照是如何处理锁的?
有人能解释一下这些是如何影响一致性、可用性甚至网络分区(CAP定理)的吗?
发布于 2016-09-25 15:30:09
数据库锁
在其他系统中,数据库锁用于保护共享资源或对象。这些受保护的资源可以
锁可以是读锁或写锁,在多个用户需要并发访问数据库时使用。这可以防止数据被损坏或失效。当多个用户尝试读取或其他用户尝试写入数据库时,会发生此类问题。
任何单个用户都可以修改数据库记录,即他们应用了锁的数据库中的项,该锁为他们提供对记录的独占访问,直到锁被释放。
悲观锁定
在悲观锁定中,当请求锁定时,立即锁定记录或页。
悲观锁定是指将记录锁定为独占使用,直到完成为止。它比乐观锁定具有更好的完整性,但要求您小心应用程序设计以避免死锁。要使用悲观锁定,您需要一个到数据库的直接连接(在两层客户机服务器应用程序中通常就是这种情况),或者需要一个可以独立于连接使用的外部可用事务ID。
乐观锁定
乐观锁定是一种策略,在这种策略中,您可以读取记录,记录版本号(其他方法包括日期、时间戳或校验和/散列),并在写回记录之前检查版本是否未更改。当您写回记录时,您可以过滤版本上的更新,以确保它是原子的。(即,当您检查版本并将记录写入磁盘时尚未更新),然后一次性更新版本。
如果记录是脏的(即与您的版本不同),则中止事务,用户可以重新启动它或回滚。
快照
快照是数据库的只读静态视图。
希望这篇文章能帮助你理解!
发布于 2021-10-10 19:20:17
并发控制是关于控制可能导致问题的不同现象,例如脏读/不可重复读/幻影读/丢失更新。你既可以乐观地认为这些问题很少发生,也可以悲观地认为它们会更频繁地发生。()
当您乐观时,首先允许发生更改并在检测到问题的情况下回滚是有意义的。回滚的代价很高,但如果很少发生,也没问题。快照隔离和可串行化快照隔离是两种乐观的并发控制算法。
悲观的并发控制是由锁完成的。
更多细节在https://www.interdb.jp/pg/pgsql05.html中:
主要有三种并发控制技术,即多版本并发控制、严格两阶段锁定(S2PL)和乐观并发控制(OCC)
https://stackoverflow.com/questions/39681748
复制相似问题