Краткое описание: В этом руководстве вы узнаете, как выполнить транзакцию на SQL Server с помощью PHP PDO.
Этот урок начинается там, где закончился урок по удалению данных из таблицы в PHP.
Создание выборочных данных
Шаг 1. Откройте SQL Server Management Studio(SSMS) и подключитесь к базе данных BookStore на вашем SQL Server.
Шаг 2. Выполните следующие операторы, чтобы вставить книги в таблицу Books, назначить эти книги автору с идентификатором 2 и обновить инвентари для этих книг в таблице Inventories:
INSERT INTO Books(Title, Publisher, ISBN, PublishedDate) VALUES
('Mastering SQL: A Comprehensive Guide', 'Tech Books Publishing', '978-1234567890', '2022-01-15'),
('The Art of Database Design', 'Expert Press', '978-0987654321', '2021-06-10'),
('SQL Queries for Mere Mortals', 'Practical SQL Publishing', '978-1122334455', '2023-03-21'),
('Advanced SQL Programming Techniques', 'Pro Code Press', '978-6677889900', '2020-09-30'),
('Database Systems: Theory and Practice', 'Academic Press', '978-5566778899', '2022-11-05');
DECLARE @BookID1 INT, @BookID2 INT, @BookID3 INT, @BookID4 INT, @BookID5 INT;
SELECT @BookID1 = BookID FROM Books WHERE ISBN = '978-1234567890';
SELECT @BookID2 = BookID FROM Books WHERE ISBN = '978-0987654321';
SELECT @BookID3 = BookID FROM Books WHERE ISBN = '978-1122334455';
SELECT @BookID4 = BookID FROM Books WHERE ISBN = '978-6677889900';
SELECT @BookID5 = BookID FROM Books WHERE ISBN = '978-5566778899';
-- Insert records into the BookAuthors table
INSERT INTO BookAuthors(BookID, AuthorID)
VALUES(@BookID1, 2),
(@BookID2, 2),
(@BookID3, 2),
(@BookID4, 2),
(@BookID5, 2);
INSERT INTO Inventories(BookID, Qty)
SELECT BookID, ABS(CHECKSUM(NEWID()) % 101) + 100
FROM Books;
-- Insert customers
INSERT INTO [dbo].[Customers](FirstName, LastName, Email, PhoneNumber, Address) VALUES
('John', 'Doe', ' [email protected] ', '123-456-7890', '123 Elm Street, Springfield, IL 62701'),
('Jane', 'Smith', ' [email protected] ', '234-567-8901', '456 Oak Avenue, Metropolis, NY 10001');
Выполнение транзакции
Создайте новый файл orderdb.php и определите класс OrderDB, который обрабатывает транзакцию:
conn = $conn;
}
public function create($customerId, $bookId, $quantity, $price, $orderDate)
{
try {
// Begin a transaction
$this->conn->beginTransaction();
// Check inventory
$this->checkInventory($bookId, $quantity);
// Insert order and get the new order ID
$orderId = $this->insertOrder($customerId, $orderDate, $price * $quantity);
// Insert order details
$this->insertOrderDetails($orderId, $bookId, $quantity, $price);
// Update inventory
$this->updateInventory($bookId, $quantity);
// Commit the transaction
$this->conn->commit();
return $orderId;
} catch(Exception $e) {
// Rollback the transaction on error
$this->conn->rollBack();
throw new Exception("Failed to create order: " . $e->getMessage());
}
}
private function checkInventory($bookId, $quantity)
{
$sql = 'SELECT Qty FROM Inventories WHERE BookId = :bookId';
$stmt = $this->conn->prepare($sql);
$stmt->execute(['bookId' => $bookId]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if($row === false || $row['Qty'] conn->prepare($sql);
$stmt->execute([
'orderDate' => $orderDate,
'customerId' => $customerId,
'totalAmount' => $totalAmount
]);
return $this->conn->lastInsertId();
}
private function insertOrderDetails($orderId, $bookId, $quantity, $price)
{
$sql = 'INSERT INTO OrderDetails(OrderId, BookId, Quantity, Price)
VALUES(:orderId, :bookId, :quantity, :price)';
$stmt = $this->conn->prepare($sql);
$stmt->execute([
'orderId' => $orderId,
'bookId' => $bookId,
'quantity' => $quantity,
'price' => $price
]);
}
private function updateInventory($bookId, $quantity)
{
$sql = "UPDATE Inventories
SET Qty = Qty - :quantity
WHERE BookId = :bookId";
$stmt = $this->conn->prepare($sql);
$stmt->execute([
'quantity' => $quantity,
'bookId' => $bookId
]);
}
}
Запуск приложения
Шаг 1. Измените файл index.php, чтобы создать заказ с помощью метода create() объекта OrderDB:
create(
$customerId,
$bookId,
$quantity,
$price,
'2024-07-27'
);
echo "New Order ID: " . $orderId;
Шаг 2. Запустите index.php в веб-браузере. Он вернет следующий вывод:
New Order ID: 1
Это означает, что приложение успешно создало заказ с идентификатором 1.
Краткое содержание
- Вызовите метод beginTransaction() объекта PDO, чтобы начать транзакцию.
- Вызовите метод commit() объекта PDO, чтобы навсегда применить изменения к базе данных.
- Вызовите метод rollback() объекта PDO для отката транзакции.

