File: transaction-integration-001.phpt

package info (click to toggle)
php-mongodb 1.15.0%2B1.11.1%2B1.9.2%2B1.7.5-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 63,984 kB
  • sloc: ansic: 328,429; xml: 10,797; php: 4,235; sh: 179; python: 47; pascal: 36; makefile: 3
file content (83 lines) | stat: -rw-r--r-- 2,694 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
--TEST--
MongoDB\Driver\Session::startTransaction() Committing a transaction with example for how to handle failures
--SKIPIF--
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
<?php skip_if_not_libmongoc_crypto(); ?>
<?php skip_if_no_transactions(); ?>
<?php skip_if_not_clean(DATABASE_NAME, COLLECTION_NAME . '_employees'); ?>
<?php skip_if_not_clean(DATABASE_NAME, COLLECTION_NAME . '_events'); ?>
--FILE--
<?php
require_once __DIR__ . "/../utils/basic.inc";

$EMPLOYEES_COL = COLLECTION_NAME . '_employees';
$EVENTS_COL =    COLLECTION_NAME . '_events';

$manager = create_test_manager();

/* Create collections as that can't be (automatically) done in a transaction */
$manager->executeCommand(
    DATABASE_NAME,
    new \MongoDB\Driver\Command([ 'create' => $EMPLOYEES_COL ]),
    [ 'writeConcern' => new \MongoDB\Driver\WriteConcern( \MongoDB\Driver\WriteConcern::MAJORITY ) ]
);

$manager->executeCommand(
    DATABASE_NAME,
    new \MongoDB\Driver\Command([ 'create' => $EVENTS_COL ]),
    [ 'writeConcern' => new \MongoDB\Driver\WriteConcern( \MongoDB\Driver\WriteConcern::MAJORITY ) ]
);


/* Do the transaction */
$session = $manager->startSession();

$session->startTransaction( [
    'readConcern' => new \MongoDB\Driver\ReadConcern( "snapshot" ),
    'writeConcern' => new \MongoDB\Driver\WriteConcern( \MongoDB\Driver\WriteConcern::MAJORITY )
] );

while (true) {
    try {
        $cmd = new \MongoDB\Driver\Command( [
            'update' => $EMPLOYEES_COL,
            'updates' => [
                [
                    'q' => [ 'employee' => 3 ],
                    'u' => [ '$set' => [ 'status' => 'Inactive' ] ],
                ]
            ]
        ] );
        $manager->executeCommand(DATABASE_NAME, $cmd, ['session' => $session]);
 
        $cmd = new \MongoDB\Driver\Command( [
            'insert' => $EVENTS_COL,
            'documents' => [
                [ 'employee' => 3, 'status' => [ 'new' => 'Inactive', 'old' => 'Active' ] ]
            ]
        ] );
        $manager->executeCommand(DATABASE_NAME, $cmd, ['session' => $session]);

        $session->commitTransaction();
        echo "Transaction committed.\n";break;
    } catch (\MongoDB\Driver\Exception\CommandException $e) {
        $rd = $e->getResultDocument();

        if (isset($rd->errorLabels) && in_array('TransientTransactionError', $rd->errorLabels)) {
            echo "Temporary error: ", $e->getMessage(), ", retrying...\n";
            $rd = $e->getResultDocument();
            var_dump($rd);
            continue;
        } else {
            var_dump($e);
        }
        break;
    }
}

?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
Transaction committed.
===DONE===