1. 一种锁是java提供的 synchronized, 同时只能有一个线程执行更新操作。比如:
public void updateUser(User user) {
synchronized (user) {
userMapper.updateByPrimaryKey(user);
}
}
2. 事务其实是另外一种锁的体现,是有隔离能力的。
3. 数据库本身是有锁机制的。比如更新锁,排他锁等,可以查看相关资料
4.在应用级别进行控制,比如在表中增加version字段。
更新的时候给版本号字段加上 1,然后 UPDATE 会返回一个更新结果的行数,通过这个行数去判断。
UPDATE 必须这样写:
UPDATE T_USER u
SET u.address =
#address#,
u.version = u.version + 1
WHERE u.username =
#username#
AND u.version =
#version#
如果更新执行返回的数量是 0 表示产生并发修改了,需要重新获得最新的数据后再进行更新操作。
Hibernate、JPA 等 ORM 框架或者实现,是使用版本号,再判断 UPDATE 后返回的数值,如果这个值小于 1 时则抛出乐观锁并发修改异常。