Transaction
Транзакцією називається виконання послідовності команд (SQL-конструкцій) у базі даних, яка або фіксується при успішній реалізації кожної команди, або скасовується при невдалому виконанні хоча б однієї команди.
START TRANSACTION;
INSERT MyUserName (FName, Lname)
VALUES ( ‘TestName0’ , ‘TestLName0’ );
INSERT MyUserTell (IdUser, TellN)
VALUES (@id = @@IDENTITY, ‘(097)2224455’ );
INSERT MyUserInfo (IdUser, Bdate)
VALUES(@id, ‘1990-01-02’ );
COMMIT;
Відкат транзакції – це дія, що забезпечує анулювання всіх змін даних, зроблених у тілі поточної незавершеної транзакції.
START TRANSACTION;
INSERT MyUserName (FName, Lname)
VALUES ( ‘TestName0’ , ‘TestLName0’ );
INSERT MyUserTell (IdUser, TellN)
VALUES (@id = @@IDENTITY, ‘(097)2224455’ );
INSERT MyUserInfo (IdUser, Bdate)
VALUES(@id, ‘1990-01-02’ );
ROLLBACK;
При виконанні транзакцій кількома користувачами однієї бази даних можуть виникати такі проблеми:
• Dirtyreads
• Non-repeatablereads
• Phantomreads
Dirty reads
Dirtyreads – "брудне" читання. Перший користувач починає транзакцію, яка змінює дані. У цей час інший користувач (або транзакція, яку він створює) витягує частково змінені дані, які не є коректними.
Non-repeatable reads
Dirtyreads – неповторне читання. Перший користувач починає транзакцію, яка змінює дані. В цей час інший користувач починає та завершує іншу транзакцію. Перший користувач при повторному читанні даних (наприклад, якщо до його транзакції входить кілька інструкцій SELECT) отримує інший набір записів.
Phantom reads
Phantomreads – читання фантомів. Перший Користувач починає транзакцію, яка вибирає дані з таблиці. У цей час інший Користувач починає та завершує транзакцію, яка вставляє або видаляє записи. Перший користувач отримає інший набір даних, що містить фантоми – видалені або змінені рядки.
Від читання, що не повторюється, воно відрізняється тим, що результат повторного звернення до даних змінився не через зміну/видалення самих цих даних, а через появу нових (фантомних) даних.
Для вирішення цих проблем розроблено чотири рівні ізоляції транзакції в SQL:
Read uncommitted.
Read committed.
Repeatableread.
Serializable.
Readuncommitted. Транзакція може зчитувати дані, із якими працюють інші транзакції.
Застосування цього рівня ізоляції може призвести до перелічених проблем..
Readcommitted. Транзакція не може прочитувати дані, з якими працюють інші транзакції.
Застосування цього рівня ізоляції унеможливлює проблему «брудного» читання..
Repeatableread. Транзакція неспроможна зчитувати дані,з якими працюють інші транзакції. Інші транзакції також можуть зчитувати дані, з якими працює ця транзакція. Застосування цього рівня ізоляції виключає всі проблеми, окрім читання фантомів.
Serializable. Транзакція повністю ізольована з інших транзакцій. Застосування цього рівня ізоляції повністю виключає всі проблеми.
Рівні ізольованості транзакцій, відмінності реалізації
Рівні ізольованості транзакцій. Застосування в SQL.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN;
START TRANSACTION;
INSERT MyUserName (FName, Lname)
VALUES ( ‘TestName0’ , ‘TestLName0’ );
INSERT MyUserTell (IdUser, TellN)
VALUES (@id = @@IDENTITY, ‘(097)2224455’ );
INSERT MyUserInfo (IdUser, Bdate)
VALUES(@id, ‘1990-01-02’ );
ROLLBACK;
Тригер – це обробник, який можна виконати під час виконання операцій INSERT, UPDATE, DELETE
CREATE TRIGGER new_profile
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO profiles(user_id) VALUES (NEW.id);
END;
Q&A
Дякую всім за заняття!🙌🏻
❗️🎓Тема уроку: 8. Транзакції. Тригери
Нагадую, що дедлайн здачі домашніх робіт – до наступного уроку.
Якщо виникають складнощі, пишіть, допоможу із задоволенням 😌
Запис лекції тренер опублікує трохи пізніше 🖥
Не забудьте повторити матеріал та підготуватися до наступного уроку📚
Успіху і до зустрічі!🤩
Прості завдання:
Завдання 1: Список клієнтів та їх замовлень. Складіть SQL-запит, який виведе імена всіх клієнтів та ідентифікатори їхніх замовлень. Використовуйте таблиці Customers (з колонками CustomerID, FirstName, LastName) та Orders (з колонками OrderID, CustomerID).
Завдання 2: Товари та їх категорії. Напишіть SQL-запит, який покаже назви всіх товарів та назви категорій, до яких вони належать. Використовуйте таблиці Products (з колонками ProductID, ProductName, CategoryID) та Categories (з колонками CategoryID, CategoryName).
Завдання 3: Інформація про співробітників та їхні відділи. Складіть SQL-запит, щоб отримати імена всіх співробітників та назви відділів, в яких вони працюють. Використовуйте таблиці Employees (з колонками EmployeeID, FirstName, LastName, DepartmentID) та Departments (з колонками DepartmentID, DepartmentName).
Завдання середньої складності:
Завдання 4: Клієнти, які зробили замовлення. Напишіть SQL-запит, який виведе імена лише тих клієнтів, які мають хоча б одне замовлення. Використовуйте таблиці Customers та Orders (з попередніх завдань).
Завдання 5: Замовлення з інформацією про клієнта та товар. Складіть SQL-запит, щоб отримати ідентифікатор замовлення, ім'я клієнта, назву товару та кількість для кожного рядка в таблиці OrderDetails. Використовуйте таблиці Orders (з колонкою OrderID, CustomerID), Customers (з колонками CustomerID, FirstName, LastName), OrderDetails (з колонками OrderDetailID, OrderID, ProductID, Quantity), та Products (з колонками ProductID, ProductName).
Завдання 6: Співробітники та їхні керівники. Припустимо, у таблиці Employees є колонка ManagerID, яка вказує на ідентифікатор керівника співробітника (який також є співробітником). Напишіть SQL-запит, який виведе ім'я співробітника та ім'я його керівника. (Потрібен self-join).
Складніші завдання:
Завдання 7: Клієнти без замовлень. Напишіть SQL-запит, який виведе імена всіх клієнтів, які не мають жодного замовлення в таблиці Orders. Використовуйте таблиці Customers та Orders.
Завдання 8: Середня кількість товарів у замовленні для кожного клієнта. Складіть SQL-запит, щоб отримати ім'я кожного клієнта та середню кількість товарів у його замовленнях. Використовуйте таблиці Customers, Orders та OrderDetails. (Потрібне групування та агрегатні функції).
Завдання 9: Товари, які ніколи не були замовлені. Напишіть SQL-запит, який виведе назви всіх товарів, які не зустрічаються в таблиці OrderDetails. Використовуйте таблиці Products та OrderDetails.
Ці завдання допоможуть вам попрактикуватися з різними типами JOIN (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, SELF JOIN) та зрозуміти їхнє застосування у різних сценаріях. Бажаю успіху!