如果将sql表拆分为同一数据库文件中的多个表,它是否有助于并发?

时间:2014-06-13 16:52:43

标签: python sql sqlite concurrency sqlalchemy

我在一个数据库文件中有一个相当大的SQL表。该表由多个独立进程访问。我使用sqlalchemy和python来访问此表。其中一个进程在表的子集上运行相当长的任务,并且只写入一些特定字段。偶尔我会遇到这种设置的并发问题。

到目前为止,我一直无法用最少的代码重现这个问题。这告诉我,我在这里不理解。

示例:

for x in session.query()
    do_something(x)
session.commit()

在发布提交之前,整个循环可能需要几分钟才能完成。

它必须与试图同时写入同一个表的两个进程有关。

我正在考虑将此表分成两个表。

当然我可以使用一个具有更好并发支持的不同数据库,但我的代码还没有在一个容易完成的地方。

问:这里有没有人有这种方法的经验和/或它是否值得减少我的并发问题?

3 个答案:

答案 0 :(得分:0)

数据库引擎在内部处理并发问题,涵盖了大多数应用程序用例。

例如,在当前事务完成之前,可以从其他进程锁定表的行;这是在足够快的时间内完成的,即使有相当多的事务,也不会影响应用程序。将任务分解为较小(可能是单数)的事务总是一个很好的策略,因此可以锁定最小行数。

答案 1 :(得分:0)

没有代码就很难说,但是我想到的第一个问题是:你为什么不使用锁?我想这个大任务看起来有点像这样:

read something from table
do something with stuff read
write something to table

如果是这样,你应该只需要在写入之前锁定表,并在之后立即释放锁。

答案 2 :(得分:0)

您使用的是InnoDB还是MyISAM?前者提供行锁定功能,而后者仅提供表锁定。

除此之外,请阅读http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html#contextual-thread-local-sessions,因为这应涵盖所有基本用例。

听起来你也可能想看看SQLAlchemy的dogpile.cache集成。