Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 1 |
n/a |
0 / 0 |
CRAP | n/a |
0 / 0 |
1 | <?php |
2 | /** |
3 | * This file contains database access object related constants. |
4 | * |
5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. |
9 | * |
10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. |
14 | * |
15 | * You should have received a copy of the GNU General Public License along |
16 | * with this program; if not, write to the Free Software Foundation, Inc., |
17 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
18 | * http://www.gnu.org/copyleft/gpl.html |
19 | * |
20 | * @file |
21 | * @ingroup Database |
22 | */ |
23 | |
24 | namespace Wikimedia\Rdbms; |
25 | |
26 | /** |
27 | * Interface for database access objects. |
28 | * |
29 | * Classes using this support a set of constants in a bitfield argument to their data loading |
30 | * functions. In general, objects should assume READ_NORMAL if no flags are explicitly given, |
31 | * though certain objects may assume READ_LATEST for common use case or legacy reasons. |
32 | * |
33 | * There are four types of reads: |
34 | * - READ_NORMAL : Potentially cached read of data (e.g. from a replica DB or stale replica) |
35 | * - READ_LATEST : Up-to-date read as of transaction start (e.g. from primary or a quorum read) |
36 | * - READ_LOCKING : Up-to-date read as of now, that locks (shared) the records |
37 | * - READ_EXCLUSIVE : Up-to-date read as of now, that locks (exclusive) the records |
38 | * All record locks persist for the duration of the transaction. |
39 | * |
40 | * A special constant READ_LATEST_IMMUTABLE can be used for fetching append-only data. Such |
41 | * data is either (a) on a replica DB and up-to-date or (b) not yet there, but on the primary/quorum. |
42 | * Because the data is append-only, it can never be stale on a replica DB if present. |
43 | * |
44 | * Callers should use READ_NORMAL (or pass in no flags) unless the read determines a write. |
45 | * In theory, such cases may require READ_LOCKING, though to avoid contention, READ_LATEST is |
46 | * often good enough. If UPDATE race condition checks are required on a row and expensive code |
47 | * must run after the row is fetched to determine the UPDATE, it may help to do something like: |
48 | * - a) Start transaction |
49 | * - b) Read the current row with READ_LATEST |
50 | * - c) Determine the new row (expensive, so we don't want to hold locks now) |
51 | * - d) Re-read the current row with READ_LOCKING; if it changed then bail out |
52 | * - e) otherwise, do the updates |
53 | * - f) Commit transaction |
54 | * |
55 | * @stable to implement |
56 | * |
57 | * @since 1.20 |
58 | */ |
59 | interface IDBAccessObject { |
60 | /** Constants for object loading bitfield flags (higher => higher QoS) */ |
61 | /** Read from a replica DB/non-quorum */ |
62 | public const READ_NORMAL = 0; |
63 | |
64 | /** Read from the primary/quorum */ |
65 | public const READ_LATEST = 1; |
66 | |
67 | /** Read from the primary/quorum and lock out other writers */ |
68 | public const READ_LOCKING = self::READ_LATEST | 2; // READ_LATEST (1) and "LOCK IN SHARE MODE" (2) |
69 | |
70 | /** Read from the primary/quorum and lock out other writers and locking readers */ |
71 | public const READ_EXCLUSIVE = self::READ_LOCKING | 4; // READ_LOCKING (3) and "FOR UPDATE" (4) |
72 | |
73 | /** Read from a replica DB or without a quorum, using the primary/quorum on miss */ |
74 | public const READ_LATEST_IMMUTABLE = 8; |
75 | |
76 | /** Convenience constant for tracking how data was loaded (higher => higher QoS) */ |
77 | public const READ_NONE = -1; // not loaded yet (or the object was cleared) |
78 | } |
79 | |
80 | /** @deprecated class alias since 1.43 */ |
81 | class_alias( IDBAccessObject::class, 'IDBAccessObject' ); |