Skip to content

Commit f5d70c5

Browse files
committed
Add tests verifying tx type using a lock contention scenario
1 parent dee9fa8 commit f5d70c5

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

ext/pdo_sqlite/tests/pdo_sqlite_transaction_mode.phpt renamed to ext/pdo_sqlite/tests/subclasses/pdo_sqlite_transaction_mode.phpt

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ pdo_sqlite
55
--FILE--
66
<?php
77

8-
$pdo = PDO::connect('sqlite::memory:');
8+
$dsn = 'sqlite:file:foo?mode=memory&cache=shared';
9+
$pdo = PDO::connect($dsn);
10+
$pdo2 = PDO::connect($dsn);
911

1012
// Deferred by default before any transaction mode is set
1113
var_dump($pdo->getAttribute(PDO\Sqlite::ATTR_TRANSACTION_MODE) === PDO\Sqlite::ATTR_TRANSACTION_MODE_DEFERRED);
@@ -31,6 +33,39 @@ var_dump($pdo->setAttribute(PDO\Sqlite::ATTR_TRANSACTION_MODE, 123));
3133
var_dump($pdo->setAttribute(PDO\Sqlite::ATTR_TRANSACTION_MODE_DEFERRED, true));
3234
var_dump($pdo->setAttribute(PDO\Sqlite::ATTR_TRANSACTION_MODE_IMMEDIATE, true));
3335
var_dump($pdo->setAttribute(PDO\Sqlite::ATTR_TRANSACTION_MODE_EXCLUSIVE, true));
36+
37+
// Set $pdo to deferred, try to get immediate transaction in $pdo2. There should be no lock contention
38+
$pdo->setAttribute(PDO\Sqlite::ATTR_TRANSACTION_MODE, PDO\Sqlite::ATTR_TRANSACTION_MODE_DEFERRED);
39+
$pdo->beginTransaction();
40+
try {
41+
$pdo2->exec('begin immediate transaction');
42+
$pdo2->rollBack();
43+
printf("Database is not locked\n");
44+
} catch (PDOException $e) {
45+
printf("Database is locked\n");
46+
}
47+
$pdo->rollBack();
48+
49+
// Set $pdo to immediate, try to get immediate transaction in $pdo2. There SHOULD be lock contention
50+
$pdo->setAttribute(PDO\Sqlite::ATTR_TRANSACTION_MODE, PDO\Sqlite::ATTR_TRANSACTION_MODE_IMMEDIATE);
51+
$pdo->beginTransaction();
52+
try {
53+
$pdo2->exec('begin immediate transaction');
54+
printf("Database is not locked\n");
55+
} catch (PDOException $e) {
56+
printf("Database is locked\n");
57+
}
58+
$pdo->rollBack();
59+
60+
// Set $pdo to exclusive, try to get immediate transaction in $pdo2. There SHOULD be lock contention
61+
$pdo->setAttribute(PDO\Sqlite::ATTR_TRANSACTION_MODE, PDO\Sqlite::ATTR_TRANSACTION_MODE_EXCLUSIVE);
62+
$pdo->beginTransaction();
63+
try {
64+
$pdo2->exec('begin immediate transaction');
65+
printf("Database is not locked\n");
66+
} catch (PDOException $e) {
67+
printf("Database is locked\n");
68+
}
3469
?>
3570
--EXPECT--
3671
bool(true)
@@ -46,3 +81,6 @@ bool(false)
4681
bool(false)
4782
bool(false)
4883
bool(false)
84+
Database is not locked
85+
Database is locked
86+
Database is locked

0 commit comments

Comments
 (0)