Revision 96670fe8
Von Moritz Bunkus vor mehr als 7 Jahren hinzugefügt
SL/DB/Helper/ActsAsList.pm | ||
---|---|---|
40 | 40 |
sub remove_from_list { |
41 | 41 |
my ($self) = @_; |
42 | 42 |
|
43 |
my $worker = sub {
|
|
43 |
return $self->db->with_transaction(sub {
|
|
44 | 44 |
remove_position($self); |
45 | 45 |
|
46 | 46 |
# Set to -1 manually because $self->update_attributes() would |
... | ... | |
56 | 56 |
SQL |
57 | 57 |
$self->db->dbh->do($sql, undef, $self->$primary_key_col); |
58 | 58 |
$self->$column(undef); |
59 |
}; |
|
60 |
|
|
61 |
return $self->db->in_transaction ? $worker->() : $self->db->do_transaction($worker); |
|
59 |
}); |
|
62 | 60 |
} |
63 | 61 |
|
64 | 62 |
sub add_to_list { |
... | ... | |
109 | 107 |
${group_by} |
110 | 108 |
SQL |
111 | 109 |
|
112 |
my $worker = sub {
|
|
110 |
return $self->db->with_transaction(sub {
|
|
113 | 111 |
$self->db->dbh->do($query, undef, $new_position - 1, @values); |
114 | 112 |
$self->update_attributes($column => $new_position); |
115 |
}; |
|
116 |
|
|
117 |
return $self->db->in_transaction ? $worker->() : $self->db->do_transaction($worker); |
|
113 |
}); |
|
118 | 114 |
} |
119 | 115 |
|
120 | 116 |
sub get_next_in_list { |
... | ... | |
144 | 140 |
|
145 | 141 |
my $self = ref($class_or_self) ? $class_or_self : $class_or_self->new; |
146 | 142 |
my $column = column_name($self); |
147 |
my $result = $self->db->do_transaction(sub {
|
|
143 |
my $result = $self->db->with_transaction(sub {
|
|
148 | 144 |
my $query = qq|UPDATE | . $self->meta->table . qq| SET ${column} = ? WHERE id = ?|; |
149 | 145 |
my $sth = $self->db->dbh->prepare($query) || die $self->db->dbh->errstr; |
150 | 146 |
|
... | ... | |
153 | 149 |
} |
154 | 150 |
|
155 | 151 |
$sth->finish; |
152 |
|
|
153 |
1; |
|
156 | 154 |
}); |
157 | 155 |
|
158 | 156 |
return $result; |
Auch abrufbar als: Unified diff
»with_transaction« anstelle von »do_transaction« verwenden
Es sollte so selten wie möglich »do_transaction« verwndet werden, damit
man sich immer angewöhnt, »with_transaction« zu nutzen.
Hintergründe und Unterschiede zwischen den beiden Funktionen sind in der
Dokumentation von SL/DB.pm beschrieben.