您正在讨论的问题领域通常称为“并发”。由于当目标项中的任何字段发生更改时,您的方法会警告或阻止用户更新,因此该方法通常称为“悲观并发”。实现此目的的一种方法是跟踪项目在被选择时的样子,并且仅在数据库版本看起来与您选择的版本完全相同或自特定时间以来未更新时才更新(时间戳字段可能会有所帮助) )。您还可以尝试乐观并发,其中仅检查一个用户已更新并保存回数据存储的字段是否由其他用户更新。如果您选择支持并发的 ORM 库,这两种方法都是最简单的。
我最喜欢的 python Web 库是 django,这里有一个关于您想要解决的相同情况的问题:Django:如何防止数据库条目的并发修改 https://stackoverflow.com/questions/320096/django-how-can-i-protect-against-concurrent-modification-of-data-base-entries。我希望它有帮助。
按照您建议的方式处理并发是可行的,但在大多数情况下应该避免。我以前曾在向具有复杂对象的大型系统添加并发性时这样做过,这些对象具有广泛的副作用并且没有统一的数据访问(在系统的生命周期中有大约 5 种数据访问方法,这是一个丰富多彩的系统)。这是处理并发性的容易出错且复杂的方法(我认为我有一个客户端应用程序,并在描述对象的类型和标识符的数据表中标记“已签出”项目后启动了观察者线程,签出它的用户,何时签出,以及有效期多长,以防签出对象的客户在完成后未能将其签入)。
如果您设置不使用 ORM 并在项目发生更改时向用户显示一条消息,请尝试关闭上次更新的时间戳列,然后让您的 ajax 调用检查上次更新时间是否大于它是您第一次加载该项目时的时间。因此,如果您编写通用方法来执行此操作,则只需要表名、主键和时间戳。
webservice 方法可能如下所示:
def is_most_current(table_name, id):
db = MySQLdb.connect(passwd="moonpie",db="thangs")
c=db.cursor()
c.execute("SELECT last_updated from %s where id = %s", (table_name, id))
return c.fetchone()
至于Python多线程库,由于Python的全局互锁问题,Python线程令人困惑并且性能不佳,在许多情况下你实际上可能想要生成一个新进程(多处理库相当等效并且在并行处理场景中表现更好) 。至于“self”,这是对您正在处理的类实例的引用的Pythonic约定,很像C类语言中的“this”。您可以在构造线程时为其指定唯一的名称,从而轻松识别该线程。请参阅多重处理 http://docs.python.org/library/multiprocessing.html or 线程 http://docs.python.org/library/threading.html文档以获取更多信息。如果您可以避免使用线程来解决此问题,我建议您这样做。