在python处理时锁定innoDB MySQL中的记录

在python处理时锁定innoDB MySQL中的记录,python,mysql,innodb,Python,Mysql,Innodb,我有一个名为unprocessed的表,我想在其中读取2000行,通过HTTP将它们发送到另一台服务器,然后将这些行插入到已处理的表中,并将它们从未处理的表中删除 我的python代码大致如下所示: db = MySQLdb.connect("localhost","username","password","database" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Select al

我有一个名为unprocessed的表,我想在其中读取2000行,通过HTTP将它们发送到另一台服务器,然后将这些行插入到已处理的表中,并将它们从未处理的表中删除

我的python代码大致如下所示:

db = MySQLdb.connect("localhost","username","password","database" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Select all the records not yet sent
sql = "SELECT * from unprocessed where SupplierIDToUse = 'supplier1' limit 0, 2000"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
  id = row[0]
  <code is here here for sending to other server - it takes about 1/2 a second>
  if sentcorrectly="1":
     sql = "INSERT into processed (id, dateprocessed) VALUES ('%s', NOW()')" % (id)
     try:
        inserted = cursor.execute(sql)
     except:
        print "Failed to insert"
     if inserted:
        print "Inserted"
        sql = "DELETE from unprocessed where id = '%s'" % (id)
        try:
            deleted = cursor.execute(sql)
        except:
            print "Failed to delete id from the unprocessed table, even though it was saved in the processed table."
db.close()
sys.exit(0)
我希望能够同时运行此代码,以便提高通过HTTP将这些记录发送到其他服务器的速度。 此时,如果我尝试同时运行代码,我会将相同数据的多个副本发送到另一台服务器上,并保存到已处理表中,因为select查询在代码的多个实例中获得相同的id

当我选择记录并在将其移动到已处理表之前将每条记录作为一行进行处理时,如何锁定这些记录?
该表是MyISAM,但我今天已转换为innoDB,因为我意识到可能有一种方法可以更好地使用innoDB锁定记录。

根据您的评论回复

两种解决方案中的一种是客户端python主进程,用于收集所有2000条记录的记录ID,然后将其拆分为块,由子工作人员处理

简而言之,您的选择是委派工作或依赖可能棘手的资产锁定机制。我建议使用前一种方法,因为它可以借助消息队列进行扩展

委托逻辑将使用

这将创建2000个任务,并一次运行5个任务,或者您可以使用此处概述的解决方案将记录拆分为块

将创建20个包含100条记录的列表,这些记录将分5批处理

编辑:
语法错误-签名为mapfunc,iterable[,chunksize]我省略了func的参数。

如果连接A需要从工作开始到写入时断开连接,则这部分中唯一不重复的部分可能重复。我查看了可能重复的问题,没有任何python代码,也没有解释如何从表中选择id,然后处理然后把它们从桌子上拿下来。这看起来很棒!我试图实现它,但我认为我过度简化了示例。获取ID的函数实际上返回了行数。当我使用process.mapprocess\u records传递每个记录时,记录会出现一个错误:TypeError:“datetime.datetime”对象不可订阅记录行的一个字段是datetime对象。我将如何解决此问题?1您希望将多个工作单元的列表或表传递给process.map。2 Unsubscribable表示当my_var不是类似列表的对象时,有人试图执行my_var[0]。谢谢David-现在正按照您的多处理建议运行。@3GTelecom很高兴听到分布式lite方法正在运行,
import multiprocessing
records = get_all_unprocessed_ids()
pool = multiprocessing.Pool(5) #create 5 workers
pool.map(process_records, records) 
pool.map(process_records, chunks(records, 100))