php-sqlsrv/test/functional/pdo_sqlsrv/pdo_fetch_complex_transactions.phpt

140 lines
3.4 KiB
Plaintext
Raw Normal View History

2017-04-03 22:54:30 +02:00
--TEST--
Test transactions commit, rollback and aborting in between
2017-05-02 21:00:53 +02:00
--SKIPIF--
<?php require('skipif_mid-refactor.inc'); ?>
2017-04-03 22:54:30 +02:00
--FILE--
<?php
require_once("MsCommon_mid-refactor.inc");
2017-04-03 22:54:30 +02:00
function complexTransaction($conn, $tableName)
2017-04-03 22:54:30 +02:00
{
createTable($conn, $tableName, array("c1_int" => "int", "c2_real" => "real"));
2017-04-03 22:54:30 +02:00
$stmtSelect = $conn->prepare("SELECT * FROM $tableName");
$stmtDelete = $conn->prepare("DELETE TOP(3) FROM $tableName");
2017-04-03 22:54:30 +02:00
// insert ten rows
$numRows = 10;
insertData($conn, $tableName, $numRows);
fetchData($stmtSelect, $tableName, $numRows);
2017-04-03 22:54:30 +02:00
$conn->beginTransaction();
$stmtDelete->execute();
2017-04-03 22:54:30 +02:00
$rowsAffected = $stmtDelete->rowCount();
$conn->commit();
echo "Committed deleting 3 rows\n";
2017-04-03 22:54:30 +02:00
$numRows = $numRows - $rowsAffected;
fetchData($stmtSelect, $tableName, $numRows);
2017-04-03 22:54:30 +02:00
$conn->beginTransaction();
$stmtDelete->execute();
2017-04-03 22:54:30 +02:00
$conn->rollback();
echo "Rolled back\n";
fetchData($stmtSelect, $tableName, $numRows);
2017-04-03 22:54:30 +02:00
$conn->beginTransaction();
$stmtDelete->execute();
2017-04-03 22:54:30 +02:00
$rowsAffected = $stmtDelete->rowCount();
$conn->commit();
echo "Committed deleting 3 rows\n";
2017-04-03 22:54:30 +02:00
$numRows = $numRows - $rowsAffected;
fetchData($stmtSelect, $tableName, $numRows);
2017-04-03 22:54:30 +02:00
$conn->beginTransaction();
$stmtDelete->execute();
2017-04-03 22:54:30 +02:00
$conn->rollback();
echo "Rolled back\n";
fetchData($stmtSelect, $tableName, $numRows);
2017-04-03 22:54:30 +02:00
$conn->beginTransaction();
$stmtDelete->execute();
2017-04-03 22:54:30 +02:00
echo "Deletion aborted\n";
2017-04-03 22:54:30 +02:00
return $numRows;
2017-04-03 22:54:30 +02:00
}
function insertData($conn, $tableName, $count)
2017-04-03 22:54:30 +02:00
{
$stmt = $conn->prepare("INSERT INTO $tableName (c1_int, c2_real) VALUES (?, ?)");
for ($i = 0; $i < $count; $i++) {
2017-04-03 22:54:30 +02:00
$v1 = $i + 1;
$v2 = $v1 * 1.5;
$stmt->bindValue(1, $v1);
$stmt->bindValue(2, $v2);
$stmt->execute();
2017-04-03 22:54:30 +02:00
}
}
function fetchData($stmt, $tableName, $numRows, $fetchMode = false)
2017-04-03 22:54:30 +02:00
{
$numFetched = 0;
$stmt->execute();
if ($fetchMode) {
$stmt->setFetchMode(PDO::FETCH_LAZY);
while ($result = $stmt->fetch()) {
$numFetched++;
}
} else {
while ($result = $stmt->fetch(PDO::FETCH_LAZY)) {
2017-04-03 23:46:51 +02:00
$numFetched++;
}
2017-04-03 22:54:30 +02:00
}
2017-04-03 22:54:30 +02:00
echo "Number of rows fetched: $numFetched\n";
if ($numFetched != $numRows) {
2017-04-03 22:54:30 +02:00
echo "Expected $numRows rows.\n";
}
}
//--------------------------------------------------------------------
// RunTest
//
//--------------------------------------------------------------------
echo "Test begins...\n";
try {
// Connect
$conn = connect();
$conn2 = connect();
$tableName = getTableName('testTransaction');
2017-04-03 22:54:30 +02:00
// complexTransaction() returns number of rows left in $tableName
$numRows = complexTransaction($conn, $tableName);
// disconnect first connection, transaction aborted
unset($conn);
// select table using the second connection
$stmt = $conn2->prepare("SELECT * FROM $tableName");
fetchData($stmt, $tableName, $numRows, true);
// drop test table
dropTable($conn2, $tableName);
unset($conn);
} catch (Exception $e) {
echo $e->getMessage();
}
echo "Done\n";
2017-04-03 22:54:30 +02:00
?>
--EXPECT--
Test begins...
2017-04-03 22:54:30 +02:00
Number of rows fetched: 10
Committed deleting 3 rows
Number of rows fetched: 7
Rolled back
Number of rows fetched: 7
Committed deleting 3 rows
Number of rows fetched: 4
Rolled back
Number of rows fetched: 4
Deletion aborted
Number of rows fetched: 4
Done