diff --git a/src/ORM/Connect/Database.php b/src/ORM/Connect/Database.php index ad92bf174..a129ff085 100644 --- a/src/ORM/Connect/Database.php +++ b/src/ORM/Connect/Database.php @@ -656,6 +656,20 @@ abstract class Database return false; } + + /** + * Determines if the used database supports given transactionMode as an argument to startTransaction() + * If transactions are completely unsupported, returns false. + * + * @param string $mode + * @return bool + */ + public function supportsTransactionMode(string $mode): bool + { + // Default implementation: assume all modes are a supported. + return $this->supportsTransactions(); + } + /** * Invoke $callback within a transaction * diff --git a/tests/php/ORM/TransactionTest.php b/tests/php/ORM/TransactionTest.php index c6e892f28..075c788d4 100644 --- a/tests/php/ORM/TransactionTest.php +++ b/tests/php/ORM/TransactionTest.php @@ -157,7 +157,12 @@ class TransactionTest extends SapphireTest public function testReadOnlyTransaction() { if (!DB::get_conn()->supportsTransactions()) { - $this->markTestSkipped('Current database is doesn\'t support transactions'); + $this->markTestSkipped('Current database doesn\'t support transactions'); + return; + } + + if (!DB::get_conn()->supportsTransactionMode('READ ONLY')) { + $this->markTestSkipped('Current database doesn\'t support READ ONLY transactions'); return; }