数据模型是否需要version字段
最近在设计数据库模型的时候,总会碰到要不要加version
字段的问题。并且我们通常都会把version
字段备注成乐观锁
,但这其实是不准确的。接下来我们来看一下具体的分析。
我们都明白锁是为了解决并发带来的问题。但是不知道有没有仔细想过,为什么并发就会出现问题?
结合我们之前读过的文章,很容易回答出因为存在共享数据,对共享数据的读写如果不加锁就会混乱。但是存在共享数据,就一定会出现问题吗?
我觉得出现问题的本质原因是存在一个或者多个共享数据的非原子操作,必要条件是存在读和写操作,读的数据影响写操作的结果。
从加锁与否,可以将锁简单地分成以下两类:
悲观锁,很直接的干掉了并发,问题就不存在。
乐观锁,是以写数据时候带上读数据的版本,保证并发操作只有一个成功。在等于版本号时候可以操作成功,其他情况失败。
但在实际使用version
时,我们也会在对小于
和大于
的情况做处理,更强调的是操作顺序,操作靠后的数据可以覆盖结果。那这种情况是乐观锁吗? 严格来说并不算,因为没有根据读的结果做计算。
回答开篇,使用version
字段的场景:
-
需要乐观锁,不能一条语句中完成读写。(数据库会在语句级别完成原子操作,应用程序无感知)
-
不需要乐观锁,对覆盖操作排序即可。