Django、innodb和rowlevel锁定

2024-05-16 08:29:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含要解析的数据的表和一个worker,它从中获取几个记录,对其进行处理并保存回来。它还将标志设置为“parsed”。在

现在我要运行worker的几个实例,并确保两个worker不会同时选择同一行进行处理。所以我需要阻止它。在

我使用的是django,从MySQL手册中读到的内容,可以获得一个行级锁,但我找不到任何正确执行此操作的示例。唯一一个说它非常慢:)http://djangosnippets.org/snippets/2039/

我可以有另一个字段,名为“lock until”,它是一个时间戳,在worker选择了一行之后更新为now+X分钟。这将缩短锁定时间(选择后立即更新),并阻止另一个工作线程选择该行,该工作进程将检查该行是否未“锁定”,但在选择和更新之间仍然存在锁定问题。在

谢谢! 伊恩


Tags: 数据django实例http示例内容标志记录
2条回答

在Mysql中存储数据的两种主要方式是MyISAM和InnoDB。各有利弊-

  1. InnoDB通过重放日志从崩溃或其他意外关闭中恢复。在
  2. InnoDB可以运行在可靠性较低但在某些情况下性能更高的模式下。在
  3. InnoDB会自动将多个并发插入组合在一起,并同时将它们刷新到磁盘。在
  4. InnoDB在每次事务后都会刷新事务日志,大大提高了可靠性。在
  5. 与InnoDB不同,MyISAM内置了全文搜索功能
  6. MyISAM仍然在web应用程序中广泛使用,因为在大多数数据库访问都是读取的情况下,MyISAM通常被认为比InnoDB快。在
  7. 在向InnoDB表中写入/更新数据时,只有特定的行被锁定,而在MyISAM中,整个表被锁定。在
  8. InnoDB提供完整的事务支持。在

就django模型而言,它们默认支持myisam表创建。如果需要表具有行级锁,则需要innodb。This page应该是一个好的起点:

它记录了一种钩住post_syncdb钩子的方法,以动态地发出ALTERSQL命令来更改表的引擎。(请注意,这是4年前编写的,可能需要更新到Django的当前版本)。在

将元数据添加到模型中应该很简单,这样可以指定每个表使用哪个存储引擎。然后,您可以修改上面的示例,以关闭该元数据。在

有了锁,第二个工人就会被卡住,等待锁释放。在

也许您可以在开始处理之前将条目标记为“workstartedonthissentry at[timestamp]”,并让后续的工作人员忽略这些行。然后,您可以有一个cron作业或类似的“释放”行,这些行的时间戳早于某个阈值,但还没有标记为“done”(表示工作线程死了或发生了其他错误)

相关问题 更多 >