[英]How can I lock a table in DBIx:Class?
I am writing a small application with 我正在写一个小应用程序
In my application I need to do the following; 在我的应用程序中,我需要执行以下操作;
Here is some sample code starting at step 2 这是从第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);
Now due to having multiple threads going a once the values obtained from step 3 may not be correct ( for the current 'device' ). 现在由于一次执行多个线程,从步骤3获得的值可能不正确(对于当前“设备”)。
I'm trying to find a way around this issue. 我正在尝试找到解决此问题的方法。 The only thing I can think of at the moment is putting a lock on the database tables before step 2) and unlocking after step 4).
我目前唯一能想到的就是在步骤2)之前对数据库表进行锁定,并在步骤4)之后进行解锁。
How can I do this in DBIx::Class and is this likely to resolve my issue? 如何在DBIx :: Class中执行此操作,这是否可能解决我的问题?
Thank you. 谢谢。
Something like 就像是
$schema->dbh_do("LOCK TABLES names");
...
...
$schema->dbh_do("UNLOCK TABLES");
Source: http://www.perlmonks.org/?node_id=854538 资料来源: http : //www.perlmonks.org/? node_id = 854538
Also see: How to avoid race conditions when using the find_or_create method of DBIx::Class::ResultSet? 另请参见: 使用DBIx :: Class :: ResultSet的find_or_create方法时如何避免竞争条件?
and SQLHackers::SELECT#SELECT_..._FOR_UPDATE 和SQLHackers :: SELECT#SELECT _..._ FOR_UPDATE
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.