查看到一篇MySQL文章:
每一个表,都必须存在以下五个字段:
以下4个字段可以理解:
id, is_delete, create, update
但是:version
如何理解呢?
查看到一篇MySQL文章:
每一个表,都必须存在以下五个字段:
以下4个字段可以理解:
id, is_delete, create, update
但是:version
如何理解呢?
乐观锁定:在并发环境中,version 字段可以帮助防止数据冲突。每次更新数据时,version 字段会递增。如果两个进程同时尝试更新同一条记录,只有版本号匹配的更新才会成功,从而避免数据被覆盖。
id name email version
1 Alice alice@example.com 1
alice@newdomain.com
。version
值(1)。SQL 语句:
UPDATE users
SET email = 'alice@newdomain.com', version = version + 1
WHERE id = 1 AND version = 1;
alice@anotherdomain.com
。version
值(1)。SQL 语句:
UPDATE users
SET email = 'alice@anotherdomain.com', version = version + 1
WHERE id = 1 AND version = 1;
User A 的更新请求到达:
version
值是 1,匹配成功。version
字段递增到 2。更新后的数据:
id name email version
1 Alice alice@newdomain.com 2
User B 的更新请求到达:
version
值是 2,而请求中的 version
值是 1,不匹配。通过这种乐观锁机制,每次更新都会带上当前的 version
值,并在成功更新后将 version
字段递增。这种方式确保了数据的一致性和完整性,防止了由于并发更新导致的数据冲突。
6 回答4.3k 阅读✓ 已解决
12 回答5.3k 阅读
4 回答7k 阅读
2 回答3k 阅读✓ 已解决
1 回答9k 阅读✓ 已解决
2 回答6.5k 阅读✓ 已解决
1 回答7.2k 阅读✓ 已解决
假如有两个程序同时要对同一条记录做修改:
可是两个程序谁先做完不好说,很有可能出现:
那么我们希望他们俩还是按照一定的规则做修改,至少在它们做完修改的那一刻读取出来的值是正确的。怎么办呢?要么就狠心一点,程序A说我把资源全给占了,B来了一点也不给(反过来也一样),等我做完再把资源给你做,这就是悲观锁。
要么程序A和程序B可以一起做,只不过都在开始做之前和做完修改后但还没改version这个字段前读一下它,如果verison这个字段还没变,那么说明没人在我修改的过程中也对记录做了修改,我就提交修改,并把版本号version置为version+1。如果version这个字段变了,说明在我做修改的过程中有人已经先我一步做完修改了,那么我就不做修改了(如果非要修改不可的话就重新开始这个流程直到完成修改为止)。这就是乐观锁。