假设我想跟踪有多少人从我的服务器下载某个文件,所以我通过AJAX在download按钮上运行了一个脚本。 所以基本上我只想把一个添加到数据库中的一个数字中(或者甚至是一个文本文件,JSON文件,随便什么)。 但是如果我从数据库中获得了这个数字,然后在PHP脚本中添加一个,然后将新的数字存储在我的db中,这将创建一个短暂的时间窗口,在这个时间窗口中,数字不会被更新。 一个例子:有一个用户a和一个用户B,数据库中的数字是20。 用户A下载文件,脚本获得数字20。 但是在更新数据库之前,用户B也会来下载文件。 脚本还从数据库中获取数字20。 因此脚本的两个实例都存储在数据库中21,尽管该数字现在应该是22。 我该怎么处理? 例如,我当然可以用时间戳跟踪每个单独的下载,但我很好奇,当您想要更新数据库中的值,但必须首先从数据库中获取它时,您将如何更一般地处理这个问题。 我能想到的唯一一件事,就是集成一个锁,当脚本从数据库中获取数字时设置为true,然后在存储该值时设置为false,这样其他脚本就会检查该锁,并且只有当lock==false时才会继续,但对我来说,这似乎真的很麻烦。
在使用数据库时,这是一个简单的修复:不执行update table SET value=21
,而是执行update table SET value=value+1
。
在更复杂的场景中,您需要数据库事务,但对于简单的计数器,这是不必要的。