通过具体 (Java) 示例进行乐观锁定该版本会发生什么情况?什么是乐观锁定?要将什么列类型用作版本?
我花了一上午的时间阅读了谷歌在乐观锁定方面搅动的所有顶级文章,对于我的生活,我仍然没有真正理解它。
我知道乐观锁定涉及添加一列来跟踪记录的“版本”,并且此列可以是时间戳,计数器或任何其他版本跟踪构造。但我仍然不明白这如何确保写入完整性(这意味着如果多个进程同时更新同一实体,那么之后,实体会正确反映它应该处于的真实状态)。
有人可以提供一个具体的,易于理解的例子,说明如何在Java中使用乐观锁定(也许,反对MySQL DB)。假设我们有一个实体:Person
public class Person {
private String firstName;
private String lastName;
private int age;
private Color favoriteColor;
}
并且实例将持久化到MySQL表中:Person
people
CREATE TABLE people (
person_id PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL, # } I realize these column defs are not valid but this is just pseudo-code
age INT NOT NULL,
color_id FOREIGN KEY (colors) NOT NULL # Say we also have a colors table and people has a 1:1 relationship with it
);
现在,假设有 2 个软件系统,或者 1 个带有 2 个线程的系统,它们尝试同时更新同一实体:Person
- 软件/线程 #1 正在尝试保留姓氏更改(从“John Smith”到“John Doe”")
- 软件/线程 #2 正在尝试保留最喜爱的颜色(从红色到绿色)的更改)
我的问题:
- 如何在和/或表上实现乐观锁定?(查找特定的 DDL 示例)
people
colors
- 那么,如何在应用程序/Java层利用这种乐观锁定呢?(查找特定代码示例)
- 有人可以让我经历一个场景,其中DDL /代码更改(从上面的#1和#2开始)将在我的场景(或任何其他场景)中发挥作用,并会正确“乐观地锁定”/表?基本上,我希望看到乐观的锁定在行动中,并易于理解地解释为什么它有效。
people
colors