2017-03-31 23:19:12 +02:00
|
|
|
|
--TEST--
|
2017-04-03 22:54:30 +02:00
|
|
|
|
Test transactions commit, rollback and aborting in between
|
2017-11-29 23:40:47 +01:00
|
|
|
|
--SKIPIF--
|
|
|
|
|
<?php require('skipif_versions_old.inc'); ?>
|
2017-03-31 23:19:12 +02:00
|
|
|
|
--FILE--
|
|
|
|
|
<?php
|
2017-10-04 23:22:56 +02:00
|
|
|
|
require_once('MsCommon.inc');
|
2017-03-31 23:19:12 +02:00
|
|
|
|
|
2017-11-29 23:40:47 +01:00
|
|
|
|
function complexTransaction($conn, $conn2)
|
2017-03-31 23:19:12 +02:00
|
|
|
|
{
|
2017-11-29 23:40:47 +01:00
|
|
|
|
$tableName = 'testTransaction';
|
|
|
|
|
$columns = array(new AE\ColumnMeta('int', 'c1_int'),
|
|
|
|
|
new AE\ColumnMeta('real', 'c2_real'));
|
|
|
|
|
$stmt = AE\createTable($conn, $tableName, $columns);
|
|
|
|
|
if (!$stmt) {
|
|
|
|
|
fatalError("Failed to create table $tableName\n");
|
|
|
|
|
}
|
2017-03-31 23:19:12 +02:00
|
|
|
|
sqlsrv_free_stmt($stmt);
|
|
|
|
|
|
2017-04-01 00:09:05 +02:00
|
|
|
|
$stmtSelect = sqlsrv_prepare($conn, "SELECT * FROM $tableName");
|
|
|
|
|
$stmtDelete = sqlsrv_prepare($conn, "DELETE TOP(3) FROM $tableName");
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-04-01 00:09:05 +02:00
|
|
|
|
// insert ten rows
|
|
|
|
|
$numRows = 10;
|
2017-11-29 23:40:47 +01:00
|
|
|
|
insertData($conn, $tableName, $numRows);
|
|
|
|
|
fetchData($stmtSelect, $tableName, $numRows);
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-04-01 00:09:05 +02:00
|
|
|
|
sqlsrv_begin_transaction($conn);
|
2017-10-04 23:22:56 +02:00
|
|
|
|
sqlsrv_execute($stmtDelete);
|
2017-04-01 00:09:05 +02:00
|
|
|
|
$rowsAffected = sqlsrv_rows_affected($stmtDelete);
|
|
|
|
|
sqlsrv_commit($conn);
|
|
|
|
|
echo "Committed deleting 3 rows\n";
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-04-01 00:09:05 +02:00
|
|
|
|
$numRows = $numRows - $rowsAffected;
|
2017-11-29 23:40:47 +01:00
|
|
|
|
fetchData($stmtSelect, $tableName, $numRows);
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-04-01 00:09:05 +02:00
|
|
|
|
sqlsrv_begin_transaction($conn);
|
2017-10-04 23:22:56 +02:00
|
|
|
|
sqlsrv_execute($stmtDelete);
|
2017-04-01 00:09:05 +02:00
|
|
|
|
sqlsrv_rollback($conn);
|
|
|
|
|
echo "Rolled back\n";
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-11-29 23:40:47 +01:00
|
|
|
|
fetchData($stmtSelect, $tableName, $numRows);
|
2017-03-31 23:19:12 +02:00
|
|
|
|
|
2017-04-01 00:09:05 +02:00
|
|
|
|
sqlsrv_begin_transaction($conn);
|
2017-10-04 23:22:56 +02:00
|
|
|
|
sqlsrv_execute($stmtDelete);
|
2017-04-03 22:54:30 +02:00
|
|
|
|
$rowsAffected = sqlsrv_rows_affected($stmtDelete);
|
2017-04-01 00:09:05 +02:00
|
|
|
|
sqlsrv_commit($conn);
|
|
|
|
|
echo "Committed deleting 3 rows\n";
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-04-01 00:09:05 +02:00
|
|
|
|
$numRows = $numRows - $rowsAffected;
|
2017-11-29 23:40:47 +01:00
|
|
|
|
fetchData($stmtSelect, $tableName, $numRows);
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-04-01 00:09:05 +02:00
|
|
|
|
sqlsrv_begin_transaction($conn);
|
2017-10-04 23:22:56 +02:00
|
|
|
|
sqlsrv_execute($stmtDelete);
|
2017-04-01 00:09:05 +02:00
|
|
|
|
sqlsrv_rollback($conn);
|
|
|
|
|
echo "Rolled back\n";
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-11-29 23:40:47 +01:00
|
|
|
|
fetchData($stmtSelect, $tableName, $numRows);
|
2017-03-31 23:19:12 +02:00
|
|
|
|
|
2017-04-01 00:09:05 +02:00
|
|
|
|
sqlsrv_begin_transaction($conn);
|
2017-10-04 23:22:56 +02:00
|
|
|
|
sqlsrv_execute($stmtDelete);
|
2017-04-01 00:09:05 +02:00
|
|
|
|
// disconnect first connection, transaction aborted
|
|
|
|
|
sqlsrv_close($conn);
|
|
|
|
|
echo "Deletion aborted\n";
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-04-01 00:09:05 +02:00
|
|
|
|
// select table using the second connection
|
|
|
|
|
$stmt = sqlsrv_prepare($conn2, "SELECT * FROM $tableName");
|
2017-11-29 23:40:47 +01:00
|
|
|
|
fetchData($stmt, $tableName, $numRows);
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-11-29 23:40:47 +01:00
|
|
|
|
dropTable($conn2, $tableName);
|
2017-03-31 23:19:12 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-11-29 23:40:47 +01:00
|
|
|
|
function insertData($conn, $tableName, $count)
|
2017-03-31 23:19:12 +02:00
|
|
|
|
{
|
|
|
|
|
$stmt = sqlsrv_prepare($conn, "INSERT INTO $tableName (c1_int, c2_real) VALUES (?, ?)", array(&$v1, &$v2));
|
|
|
|
|
|
2017-10-04 23:22:56 +02:00
|
|
|
|
for ($i = 0; $i < $count; $i++) {
|
2017-03-31 23:19:12 +02:00
|
|
|
|
$v1 = $i + 1;
|
|
|
|
|
$v2 = $v1 * 1.5;
|
|
|
|
|
|
2017-10-04 23:22:56 +02:00
|
|
|
|
sqlsrv_execute($stmt);
|
2017-03-31 23:19:12 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-11-29 23:40:47 +01:00
|
|
|
|
function fetchData($stmt, $tableName, $numRows)
|
2017-03-31 23:19:12 +02:00
|
|
|
|
{
|
2017-04-01 00:09:05 +02:00
|
|
|
|
$numFetched = 0;
|
2017-03-31 23:19:12 +02:00
|
|
|
|
sqlsrv_execute($stmt);
|
2017-10-04 23:22:56 +02:00
|
|
|
|
while ($result = sqlsrv_fetch($stmt)) {
|
2017-04-01 00:09:05 +02:00
|
|
|
|
$numFetched++;
|
|
|
|
|
}
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-04-01 00:09:05 +02:00
|
|
|
|
echo "Number of rows fetched: $numFetched\n";
|
2017-10-04 23:22:56 +02:00
|
|
|
|
if ($numFetched != $numRows) {
|
2017-04-01 00:09:05 +02:00
|
|
|
|
echo "Expected $numRows rows.\n";
|
|
|
|
|
}
|
2017-03-31 23:19:12 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-11-29 23:40:47 +01:00
|
|
|
|
try {
|
|
|
|
|
set_time_limit(0);
|
|
|
|
|
sqlsrv_configure('WarningsReturnAsErrors', 1);
|
2017-05-02 02:01:30 +02:00
|
|
|
|
|
2017-11-29 23:40:47 +01:00
|
|
|
|
echo "\nTest begins...\n";
|
2017-10-04 23:22:56 +02:00
|
|
|
|
|
2017-11-29 23:40:47 +01:00
|
|
|
|
// Connect
|
|
|
|
|
$conn = AE\connect();
|
|
|
|
|
$conn2 = AE\connect();
|
2017-04-01 00:09:05 +02:00
|
|
|
|
|
2017-11-29 23:40:47 +01:00
|
|
|
|
complexTransaction($conn, $conn2);
|
2017-03-31 23:19:12 +02:00
|
|
|
|
|
2017-11-29 23:40:47 +01:00
|
|
|
|
sqlsrv_close($conn2); // $conn should have been closed
|
|
|
|
|
} catch (Exception $e) {
|
|
|
|
|
echo $e->getMessage();
|
2017-03-31 23:19:12 +02:00
|
|
|
|
}
|
2017-11-29 23:40:47 +01:00
|
|
|
|
echo "\nDone\n";
|
2017-03-31 23:19:12 +02:00
|
|
|
|
|
|
|
|
|
?>
|
|
|
|
|
--EXPECT--
|
|
|
|
|
|
2017-05-02 02:01:30 +02:00
|
|
|
|
Test begins...
|
2017-04-01 00:09:05 +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
|
2017-03-31 23:19:12 +02:00
|
|
|
|
|
|
|
|
|
Done
|