我花了整个上午阅读了Google搜索出来的关于乐观锁的文章, 但是我还是不太明白。
我知道乐观锁涉及添加用于跟踪记录“版本”的列,该列可以是时间戳、计数器或任何其他版本跟踪构造。但我仍然不明白如何确保写入完整性(这意味着如果多个进程同时更新同一实体,则之后,实体应正确反映其应处于的真实状态)。
有人能提供一个在Java中使用乐观锁的具体、易于理解的示例吗?假设我们有一个
现在假设有两个软件系统,或者一个系统上有两个线程,它们正在尝试同时更新同一个“人”实体:
我知道乐观锁涉及添加用于跟踪记录“版本”的列,该列可以是时间戳、计数器或任何其他版本跟踪构造。但我仍然不明白如何确保写入完整性(这意味着如果多个进程同时更新同一实体,则之后,实体应正确反映其应处于的真实状态)。
有人能提供一个在Java中使用乐观锁的具体、易于理解的示例吗?假设我们有一个
Person
实体,并使用MySQL数据库。public class Person {
private String firstName;
private String lastName;
private int age;
private Color favoriteColor;
}
这意味着Person
实例将被持久化到一个名为people
的MySQL表中:
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
);
现在假设有两个软件系统,或者一个系统上有两个线程,它们正在尝试同时更新同一个“人”实体:
- 软件/线程#1正在尝试持久化姓氏更改(从“John Smith”到“John Doe”)
- 软件/线程#2正在尝试持久化最喜欢的颜色更改(从红色到绿色)
我的问题:
- 如何在people和/或colors表上实现乐观锁定? (寻找具体的DDL示例)
- 然后,您如何在应用程序/Java层中利用此乐观锁定? (寻找特定的代码示例)
- 能否向我演示一种情况,其中DDL /代码更改(来自上述#1和#2)将在我的场景(或任何其他场景)中发挥作用,并且会正确地“乐观锁定”people/colors表? 基本上,我想看到乐观锁定的实际效果,并易于理解为什么它有效。