The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

App::Netdisco::DB::ExplicitLocking - Support for PostgreSQL Lock Modes

SYNOPSIS

In your DBIx::Class schema:

 package My::Schema;
 __PACKAGE__->load_components('+App::Netdisco::DB::ExplicitLocking');

Then, in your application code:

 use App::Netdisco::DB::ExplicitLocking ':modes';
 $schema->txn_do_locked($table, MODE_NAME, sub { ... });

This also works for the ResultSet:

 package My::Schema::ResultSet::TableName;
 __PACKAGE__->load_components('+App::Netdisco::DB::ExplicitLocking');

Then, in your application code:

 use App::Netdisco::DB::ExplicitLocking ':modes';
 $schema->resultset('TableName')->txn_do_locked(MODE_NAME, sub { ... });

DESCRIPTION

This DBIx::Class component provides an easy way to execute PostgreSQL table locks before a transaction block.

You can load the component in either the Schema class or ResultSet class (or both) and then use an interface very similar to DBIx::Class's txn_do().

The package also exports constants for each of the table lock modes supported by PostgreSQL, which must be used if specifying the mode (default mode is ACCESS EXCLUSIVE).

EXPORTS

With the :modes tag (as in SYNOPSIS above) the following constants are exported and must be used if specifying the lock mode:

  • ACCESS_SHARE

  • ROW_SHARE

  • ROW_EXCLUSIVE

  • SHARE_UPDATE_EXCLUSIVE

  • SHARE

  • SHARE_ROW_EXCLUSIVE

  • EXCLUSIVE

  • ACCESS_EXCLUSIVE

METHODS

$schema->txn_do_locked($table|\@tables, MODE_NAME?, $subref)

This is the method signature used when the component is loaded into your Schema class. The reason you might want to use this over the ResultSet version (below) is to specify multiple tables to be locked before the transaction.

The first argument is one or more tables, and is required. Note that these are the real table names in PostgreSQL, and not DBIx::Class ResultSet aliases or anything like that.

The mode name is optional, and defaults to ACCESS EXCLUSIVE. You must use one of the exported constants in this parameter.

Finally pass a subroutine reference, just as you would to the normal DBIx::Class txn_do() method. Note that additional arguments are not supported.

$resultset->txn_do_locked(MODE_NAME?, $subref)

This is the method signature used when the component is loaded into your ResultSet class. If you don't yet have a ResultSet class (which is the default - normally only Result classes are created) then you can create a stub which simply loads this component (and inherits from DBIx::Class::ResultSet).

This is the simplest way to use this module if you only want to lock one table before your transaction block.

The first argument is the optional mode name, which defaults to ACCESS EXCLUSIVE. You must use one of the exported constants in this parameter.

The second argument is a subroutine reference, just as you would pass to the normal DBIx::Class txn_do() method. Note that additional arguments are not supported.