15-amaliy mashg’ulot
Mavzu: Tranzaktsiyalarni boshqarish
Ishdan maqsad: Tranzaktsiyalarni boshqarishni o’rganish
{ sql_statement | statement_block }
END
Argumentlar
{sql_statement | bayonot_block}
Har qanday amaldagi Transact-SQL bayonoti yoki bayonot bloki yordamida
aniqlangan bayonot guruhi.
Izohlar
BEGIN ... END bloklari joylashishi mumkin.
Barcha Transact-SQL bayonotlari BEGIN ... END blokida amal qilishiga
qaramay, ba'zi Transact-SQL bayonotlari bitta paket (guruhlar bloki) ichida
guruhlanmasligi kerak.
Misollari
Quyidagi misolda BEGIN va END kalit so'zlari birgalikda ishlaydigan
Transact-SQL bayonotlar to'plamini belgilaydi. Agar siz BEGIN ... END blokini
qo'shmasangiz, ikkala ROLLBACK TRANSACTION bayonoti bajariladi va ikkala
xabar ham qaytariladi
USE AdventureWorks2012
GO
BEGIN TRANSACTION
GO
IF @@TRANCOUNT = 0
BEGIN
SELECT FirstName, MiddleName
FROM Person.Person WHERE LastName = 'Adams'
ROLLBACK TRANSACTION
613-18 guruhi. Q.Ergashaliyev
Transact-SQL bayonotlari guruhini bajarishga imkon beradigan Transact
SQL bayonotlari ketma-ketligini o'z ichiga oladi. BEGIN va END kalit so'zlari
boshqaruv oqimi tiliga ishora qiladi.
Syntaxsql
BEGIN PRINT N'Rolling back the transaction two times would cause an error.'
END
ROLLBACK TRANSACTION
PRINT N'Rolled back the transaction.'
GO
/*
Rolled back the transaction.
*/
COMMIT (ingliz tilidan tarjimasi - "majburiyat, majburiyat") - bu
operatsiyani muvaffaqiyatli yakunlash uchun SQL tilining tranzaktsiyalarini
boshqarish operatori. Ko'chirma rasmiylashtirilgandan so'ng, bitim boshlanishidan
boshlab kiritilgan va boshqa operatsiyalar uchun ilgari ko'rinmaydigan o'zgarishlar
ma'lumotlar bazasiga kiritiladi
ROLLBACK iborasi tranzaktsiyadagi barcha o'zgarishlarni qaytarish uchun
ishlatiladi. Ushbu ikkita ko'rsatma tranzaktsiyani aniq yakunlaydi.
Oracleda
COMMIT-ni bajarishdan oldin Oracle ma'lumotlar jurnallarini bekor qilish
va qayta tiklashni yaratadi (ular hatto diskka yozilishi mumkin). COMMIT
buyrug'i bajarilgandan so'ng, qayta ro'yxatdan o'tkaziladigan tranzaktsiyalar
jadvallari SCN bilan belgilanadi (tizim o'zgarishi raqami), qayta ro'yxatga olish
buferlari diskka yuviladi (bu bosqichda tranzaksiya tugallangan deb hisoblanadi),
blokirovkalari bo'shatiladi va bitim tugagan deb belgilanadi.
Foydalanish bo'yicha eslatmalar
Birinchi ACID printsipiga muvofiq COMMIT WORK yoki ROLLBACK
WORK buyruqlaridan foydalangan holda dasturlarda tranzaktsiyalarni aniq
yakunlash tavsiya etiladi: tranzaksiya atomik bo'lishi kerak. Agar tranzaktsiyaning
aniq yozuvi bajarilmagan bo'lsa va dastur g'ayritabiiy ravishda tugatilgan bo'lsa,
ma'lumotlar bazasi oxirgi yozilmagan operatsiyani qaytarib beradi.
Misol
MyTable-ga qator qo'shish va o'zgarishni saqlash uchun quyidagi
buyruqlarni kiriting:
BEGIN TRANSACTION WORK;
INSERT INTO MyTable VALUES ('50', 'some string');
COMMIT WORK;ROLLBACK (orqaga qaytarishdan) bu quyidagilar uchun ishlatiladigan
SQL bayonoti:
Tranzaksiya boshlangandan beri yoki biron bir tejash nuqtasidan
(SAVEPOINT) kiritilgan barcha o'zgarishlarni bekor qilish;
Ushbu operatsiya uchun barcha saqlash punktlarini tozalash;
Bitimni yakunlash;
Ushbu tranzaksiya uchun barcha qulflarni bo'shatish.
COMMIT bayonoti tranzaktsiyadagi barcha o'zgarishlarni muvaffaqiyatli
yakunlash uchun ishlatiladi.
Misol
MyTable jadvaliga yozuv qo'shish va keyin ushbu amalni bekor qilish uchun
quyidagi buyruqlarni kiriting:
BEGIN TRANSACTION WORK;
INSERT INTO MyTable VALUES ('50', 'some string');
ROLLBACK WORK;
Amaliy qism
mysql> create table accounts(
-> number int,
-> balance float,
-> primary key(number));
Query OK, 0 rows affected (0.26 sec)
mysql> insert into accounts values(12345,1025),(67890,140);Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from accounts;
+--------+---------+
| number | balance |
+--------+---------+
| 12345 | 1025 |
| 67890 | 140 |
+--------+---------+
2 rows in set (0.00 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select balance from accounts where number=12345 for update;
+---------+
| balance |
+---------+
| 1025 |
+---------+
1 row in set (0.00 sec)
mysql> update accounts set balance= balance+25 where number=12345;
Query OK, 1 row affected (0.06 sec)Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from accounts;
+--------+---------+
| number | balance |
+--------+---------+
| 12345 | 1050 |
| 67890 | 140 |
+--------+---------+
2 rows in set (0.00 sec)
mysql> begin;
Query OK, 0 rows affected (0.01 sec)
mysql> update accounts set balance= balance-250 where number=12345;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update accounts set balance= balance+250 where number=67890;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from accounts;
+--------+---------+
| number | balance |+--------+---------+
| 12345 | 800 |
| 67890 | 390 |
+--------+---------+
2 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from accounts;
+--------+---------+
| number | balance |
+--------+---------+
| 12345 | 1050 |
| 67890 | 140 |
+--------+---------+
2 rows in set (0.00 sec)
Xulosa
Ushbu amaliy mashg’ulotda tranzaktsiyalarni boshqarishni ko’rib chiqdim va
amaliy o’rgandim.
Do'stlaringiz bilan baham: |