Version 2 (modified by 3 weeks ago) ( diff ) | ,
---|
Трансакции во MSSQL
Трансакциите се битен дел од системите за управување со бази на податоци преку кои се обезбедува атомичност, конзистентност, изолација и трајност (ACID).
Со други зборови, сите операции групирани во една трансакција или ќе се извршат во целост или воопшто нема да се извршат.
Во SQL Server клучни зборови кои се користат кога станува збор за трансакции се:
- BEGIN TRANSACTION – почеток на трансакција
- COMMIT TRANSACTION – потврдување на трансакција
- ROLLBACK TRANSACTION – поништување на промените
- SAVE TRANSACTION – дефинирање на savepoint
Нивоа на изолација на трансакциите во SQL Server:
- READ UNCOMMITTED – најниско ниво на изолација. Овозможува пристап до податоци кои не се потврдени од други трансакции (т.н. dirty reads).
Пример:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; BEGIN TRANSACTION; SELECT IsAvailable FROM [dbo].[FoodItem] WHERE name LIKE N’%Coffee%’;
Во ваквото сценарио, доколку друга трансакција направи UPDATE врз полето IsAvailable на истиот запис, но сè уште не е COMMIT, првата трансакција ќе може да ја види таа непотврдена промена.
- READ COMMITED - Ова е стандардното ниво во SQL Server. Податоците што ги гледа една трансакција секогаш се потврдени (committed) од други трансакции. Но, тоа значи дека една иста SELECT изјава може да врати различни резултати ако во меѓувреме друг корисник направи COMMIT.
(Ова ниво дозволува non-repeatable reads и phantom reads.) додека спречува dirty reads.
Пример:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN TRANSACTION; SELECT * FROM Orders WHERE CustomerId = 1;
- REPEATABLE READ - Ова ниво осигурува дека сите редови што се прочитани од трансакцијата не можат да бидат изменети од друга трансакција додека не заврши. Сепак, можат да се појават phantom rows (нови редови кои се вметнати од други трансакции и одговараат на критериумот).
Пример:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN TRANSACTION; SELECT COUNT(*) AS total_orders_created FROM [dbo].[Order] WHERE OrderGlobalStatus = 1;
Во ова сценарио, истите редови ќе останат достапни во истата состојба за време на целата трансакција.
- SERIALIZABLE - Највисокото класично ниво на изолација. Сите конкурентни трансакции се извршуваат како да се серијализирани една по друга. Се спречуваат и phantom reads преку поставување на range locks.
Пример:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; UPDATE [dbo].[FoodItem] SET Price = 10 WHERE Id = 5;
Ако друга трансакција се обиде да го измени истиот ред со UPDATE, ќе мора да почека или ќе добие deadlock error.
- SNAPSHOT (SQL Server) - Ова е ниво на изолација кое постои во SQL Server. Овозможува читање на конзистентна слика на податоците во моментот на започнување на трансакцијата. Сите SELECT-и во рамките на истата трансакција ја гледаат базата како што била во моментот на старт, без блокирање.
Пример:
ALTER DATABASE [QuickBite] SET ALLOW_SNAPSHOT_ISOLATION ON; SET TRANSACTION ISOLATION LEVEL SNAPSHOT; BEGIN TRANSACTION; SELECT * FROM [dbo].[Order] WHERE BusinessId = 3;
Ова е многу корисно за системи каде се бара висока конкурентност без премногу заклучувања (lock contention).
Тестирање на трансакции и конкурентно извршување на ресурси со помош на Apache JMeter
Тест 1: Креирање на random Order;
- Number of threads = 1
- Number of threads = 100
- Number of threads = 1000
Тест 2: Креирање на random Order заедно со историја на нарачката Order_History во истата трансакција
- Number of threads = 100
Attachments (4)
- insert_random_order_1_thread.png (77.6 KB ) - added by 3 weeks ago.
- insert_random_order_100_thread.png (116.7 KB ) - added by 3 weeks ago.
- insert_random_order_1000_thread.png (137.1 KB ) - added by 3 weeks ago.
- multiple_insert_single_transaction_100_thread.png (68.3 KB ) - added by 3 weeks ago.
Download all attachments as: .zip