以下4个字段可以理解: ``id, is_delete, create, update ` 但是: `version`如何理解呢?

查看到一篇MySQL文章:
每一个表,都必须存在以下五个字段:
image.png

以下4个字段可以理解:

id, is_delete, create, update

但是:
version如何理解呢?

阅读 7.1k
2 个回答

假如有两个程序同时要对同一条记录做修改:

程序A希望修改之后看到的记录是a
程序B希望修改之后看到的记录是b

可是两个程序谁先做完不好说,很有可能出现:

程序A修改完后看到的记录是b
程序B修改完后看到的记录是a

那么我们希望他们俩还是按照一定的规则做修改,至少在它们做完修改的那一刻读取出来的值是正确的。怎么办呢?要么就狠心一点,程序A说我把资源全给占了,B来了一点也不给(反过来也一样),等我做完再把资源给你做,这就是悲观锁。

要么程序A和程序B可以一起做,只不过都在开始做之前和做完修改后但还没改version这个字段前读一下它,如果verison这个字段还没变,那么说明没人在我修改的过程中也对记录做了修改,我就提交修改,并把版本号version置为version+1。如果version这个字段变了,说明在我做修改的过程中有人已经先我一步做完修改了,那么我就不做修改了(如果非要修改不可的话就重新开始这个流程直到完成修改为止)。这就是乐观锁。

乐观锁定:在并发环境中,version 字段可以帮助防止数据冲突。每次更新数据时,version 字段会递增。如果两个进程同时尝试更新同一条记录,只有版本号匹配的更新才会成功,从而避免数据被覆盖。

举个例子

初始化数据

id   name   email               version
1    Alice  alice@example.com   1

情景描述

  1. 两个用户(User A 和 User B)同时读取了这条记录,并且都想更新用户的电子邮件地址。

User A 更新请求

  • 读取数据后,决定将电子邮件更新为 alice@newdomain.com
  • 发送更新请求,带上当前的 version 值(1)。

SQL 语句

UPDATE users
SET email = 'alice@newdomain.com', version = version + 1
WHERE id = 1 AND version = 1;

User B 更新请求

  • 读取数据后,决定将电子邮件更新为 alice@anotherdomain.com
  • 发送更新请求,也带上当前的 version 值(1)。

SQL 语句

UPDATE users
SET email = 'alice@anotherdomain.com', version = version + 1
WHERE id = 1 AND version = 1;

数据库处理更新请求

  1. User A 的更新请求到达

    • 数据库检查记录的 version 值是 1,匹配成功。
    • 于是更新记录,并将 version 字段递增到 2。

更新后的数据

id   name   email               version
1    Alice  alice@newdomain.com 2
  1. User B 的更新请求到达

    • 数据库检查记录的 version 值是 2,而请求中的 version 值是 1,不匹配。
    • 因此,数据库拒绝这次更新请求,避免了数据冲突。

总结

通过这种乐观锁机制,每次更新都会带上当前的 version 值,并在成功更新后将 version 字段递增。这种方式确保了数据的一致性和完整性,防止了由于并发更新导致的数据冲突。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏