如何在DBIx:Class中锁定表?

时间:2015-01-07 08:35:39

标签: mysql multithreading perl dbix-class mojolicious

我正在用

编写一个小应用程序
  • Mojolicious
  • DBIx :: Class
  • Hypnotoad是一个预分叉网 服务器
  • MySQL的

在我的申请中,我需要做以下事情;

  1. 做一些复杂的处理(需要一分钟才能完成)
  2. 将上述处理中的结果数据插入表格
  3. 获取某些表的最后一次自动增量,再进行一些处理。
  4. 使用(3)中的值作为插入另一个表(联结表)的一部分
  5. 以下是从第2步开始的一些示例代码

    #step 2
    my $device = $device_rs->create(
     {
      devicename      => $deviceName,
      objects         => \@objects
      object_groups   => \@objectgroups,
    
    }
    );
    
    #step 3
    my $lastogid  = $db->resultset('ObjectGroup')->get_column('objectgroupid')->max;
    my $lastobid  = $db->resultset('Object')->get_column('objectid')->max;
    
    my $obgcount = scalar(@objectgroups);
    my $objcount = scalar(@objects);
    
    my $ogoffset = $lastogid - $obgcount;
    my $oboffset = $lastobid - $objcount;
    
    #now increment the object/group ids by the offset which will be inserted into the many-  many table
    foreach my $hash (@childobjects) {
     $hash->{'objectgroup_objectgroupid'} += $ogoffset;
     $hash->{'object_objectid'}           += $oboffset;
    }
    
    #step 4  - populate the junction table
    $db->resultset('ObjectGroupHasObjects’)->populate(\@childobjects);
    

    现在由于多个线程进行一次,从步骤3获得的值可能不正确(对于当前的“设备”)。

    我正试图找到解决这个问题的方法。我现在唯一能想到的就是在步骤2)之前锁定数据库表并在步骤4之后解锁。

    如何在DBIx :: Class中执行此操作,这是否可能解决我的问题?

    谢谢。

1 个答案:

答案 0 :(得分:2)

这样的东西
$schema->dbh_do("LOCK TABLES names");
...
...
$schema->dbh_do("UNLOCK TABLES");

来源:http://www.perlmonks.org/?node_id=854538

另见:How to avoid race conditions when using the find_or_create method of DBIx::Class::ResultSet?

SQLHackers::SELECT#SELECT_..._FOR_UPDATE