سلام دوستان گرامی ، خوب هستید؟ با سری اموزش ها یی در رابطه با Sql درخدمت شما هستم ، امیدوارم که براتون مثمر ثمر باشه و بتونه تاثیری هرچندکمرنگ در آموزه های شما بگذاره.تراکنش transactions)) به یک عملیات یا مجموعه ای از عملیاتها میگویند که در یک مجموعه انجام شده و مسول انجام شدن عملییات ها استفاده هستند. به همین خاطر قوانینی هستند که باید آنها را رعایت کرد. همچنین راهکارهایی برای استفاده بهینه از transaction تعبیه شده است.

این قواعد زیر مخفف ACID تعریف میشوند

۱٫ Atomicity (A): چنانچه transaction شامل مجموعه ای از عملیاتها باشد همه آنها میبایست که اجرا شوند. در غیراین صورت , حتی اگر یک عملیات اجرا نشود بقیه آنها نیز اجرا نخواهند شد.

۲٫ Consistency (C) : عملیات ها باید همسان باشند

۳٫ Isolation (I): : زمانی که عملیات ها اجرا میشوند , آنها میبایست که از یکدیگر جدا باشند. این به این خاطر است که از مخلوط شدن آنها در یک server یا یک database جلوگیری شود.

۴٫ Durability (D) : هنگام اجرا کردن عملیاتها , کامپیوتر تغییرات آنها را رصد میکند. اگر اشکالی باعث توقف عملیاتها شده و کلمپیوتر restart شود بعد از restart شدن خودبه خود عملیات را ادامه میدهد. بعد از اجرا شدن عملیات و اطمینان از بی نقص بودن باید آن را save کرد و برای دفعات بعد به کار برد.
شروع یک transasction

قبل از ایجاد یک transactions , شما بیاد عملیات را تعریف کنید. برای مشخص کرد شروع یک transactions , قبل از اولین عملیات , کلمه ی BEGIN TRAN یا BEGIN TRANSACTION را به همراه فرمول زیر تایپ کنید:

BEGIN { TRAN | TRANSACTION }

[ { transaction_name | @tran_name_variable }

[ WITH MARK [ ‘description’ ] ]

]

[ ; ]

عبارت را با BEGIN TRAN یا BEGIN TRANSACTION شروع کرده و سپس میتوانید به دلخواه transaction_name را قرار دهید. اگر از عبارات متنی استفاده میکنید (char, nchar, varchar, or nvarchar اسم transaction را برا اساس آنها انتخاب کرده اید میتوانید transaction_name را حذف کرده و از اسم متغیر استفاده کند. چنانچه مایل به شرح transaction در log file هستید , کلمه ی WITH MARK را تایپ کرده و شرح را در فایل بنویسید.

کد بین BEGIN TRAN یا BEGIN TRANSACTION قسمتی از transaction است
پایان transaction
استفاده از transaction

بعد از تعریف عملیات , که قسمتی از transaction است, موتور database ترتیب وار آنها را اجرا میکند. شما باید مکان پایان transaction ها رامشخص کنید. برای یان کار BEGIN TRAN یا BEGIN TRANSACTION را تایپ کنید :

BEGIN TRAN Name or BEGIN TRANSACTION Name

Operations

COMMIT TRAN Name or COMMIT TRANSACTION Name

مثال :

BEGIN TRAN Name or BEGIN TRANSACTION Name

Operations

COMMIT TRAN Name or COMMIT TRANSACTION Name

USE Exercise;

Go

CREATETABLEAdministration.Employees

‎(

‎EmployeeNumbernvarchar(10),

‎EmployeeNamenvarchar(50),

‎DateHireddate,

‎HourlySalarymoney

‎);

GO

INSERTINTOAdministration.Employees

VALUES(N’593705′,N’Frank Somah’,N’20061004′, 26.15),

‎ (N’720947′,N’Paul Handsome’,N’20000802′, 36.05);

GO

INSERTINTOAdministration.Employees(EmployeeName,EmployeeNumber,DateHired)

VALUES(N’Clarice Simms’,N’971403′,N’20011112′);

GO

BEGINTRANSACTIONAddEmployees

INSERTINTOAdministration.Employees

VALUES(N’595002′,N’John Meah’,N’20000212′, 32.25);

GO

INSERTINTOAdministration.Employees

VALUES(N’928375′,N’Chuck Stansil’,N’20080628′);

GO

INSERTINTOAdministration.Employees

VALUES(N’792764′,N’Orlando Perez’,N’20000616′, 12.95);

GO

COMMITTRANSACTIONAddEmployees;

GO

INSERTINTOAdministration.Employees(EmployeeName,EmployeeNumber,

‎ HourlySalary,DateHired)

VALUES(N’Gina Palau’,N’247903′, 18.85,N’20080612′);

GO

ان کد از database engine درخواست ایجاد یک table به نام employee را در Administration schema Exercise database میکند. بعد از تشکیل table , باید اول یک record و سپس ۲ record تشکیل دهد. سپس بیاد یک transaction شامل ۳ record را انجام دهد. بعد از آن transaction , وارد کردن دادها با اضافه کردن record ها ادامه پیدا کرده برای درک بهتر ما یک error را در کد transation قرار میدهیم. کد بالا شکل زیر را نتیجه خواهد داد :

SQL SERVER آموزش

Table نهایی به شکل زیر خواهد بود:

SQL SERVER آموزش

توجه کنید که کد transaction کامل نبوده و record تشکیل نمیشود
عقبگرد یک transasction

کد زیر را در نظر بگیرید

USE Exercise;

GO

DROPTABLEAdministration.Employees

GO

CREATETABLEAdministration.Employees

‎(

‎EmployeeNumbernvarchar(10),

‎EmployeeNamenvarchar(50),

‎DateHireddate,

‎HourlySalarymoney

‎);

GO

BEGINTRANSACTIONAddEmployees

INSERTINTOAdministration.Employees

VALUES(N’593705′,N’Frank Somah’,N’20061004′, 26.15),

‎ (N’720947′,N’Paul Handsome’,N’20000802′, 36.05),

‎ (N’595002′,N’John Meah’,N’20000212′, 32.25);

GO

INSERTINTOAdministration.Employees(EmployeeName,EmployeeNumber,DateHired)‎VALUES(N’Clarice Simms’,N’971403′,N’20011112′);

GO

INSERTINTOAdministration.Employees

VALUES(N’928375′,N’Chuck Stansil’,N’20080628′);

GO

INSERTINTOAdministration.Employees

VALUES(N’792764′,N’Orlando Perez’,N’20000616′, 12.95);

GO

INSERTINTOAdministration.Employees(EmployeeName,EmployeeNumber,

‎ HourlySalary,DateHired)

VALUES(N’Gina Palau’,N’247903′, 18.85,N’20080612′);

GO

COMMITTRANSACTIONAddEmployees;

GO

هنگام اجرا در query editor نتیجه زیر به دست خواهد آمد

SQL SERVER آموزش

توجه کنید که در کد transaction یک error وجود دارد. record ایجاد شده به صورت زیر است :

SQL SERVER آموزش

ملاحطه میکنید که با وجود error , transaction اجرا شده و بخشی که خطا دارد نادیده گرفته خواهد شد.

در بعضی موارد برای به کار بردن قواعد اشاره شده در بالا , ممکن است که در صورت وجود خطا در یک section , از اجرای transaction صرف نظر کنید. به عبارت دیگر , یک Transaction باید کاملا درست باشد یا اصلا اجرا نشود.برای درخواست از database engine برای تایید درستی آن , اصطلا آن را عقبگرد میکنیم. به این منظور به جای اجرای از عبارت ROLLBACK TRANSACTION به صورت زیر استفاده میکنیم :

ROLLBACK { TRAN | TRANSACTION }

[ transaction_name | @tran_name_variable

| savepoint_name | @savepoint_variable ]

[ ; ]

عبارت را با ROLLBACK TRAN یا ROLLBACK TRANSACTIONشروع کنید. در صورت اسم داشتن transaction ,اسم یا متغیر حاوی اسم را تایپ کنید.. در صورت تمایل برای ذخیره از عبارت savepoint_name یا @savepoint_variable استفاده کنید.

مثال زیر نشان میدهد که یک transaction در صورت موفق نبودن باید عقبگرد کند.

USE Exercise;

GO

DROPTABLEAdministration.Employees

GO

CREATETABLEAdministration.Employees

‎(

‎EmployeeNumbernchar(10),

‎EmployeeNamenvarchar(50),

‎DateHireddate,

‎HourlySalarymoney

‎);

GO

BEGINTRANSACTIONAddEmployees

INSERTINTOAdministration.Employees

VALUES(N’593705′,N’Frank Somah’,N’20061004′, 26.15),

‎ (N’720947′,N’Paul Handsome’,N’20000802′, 36.05),

‎ (N’595002′,N’John Meah’,N’20000212′, 32.25);

GO

INSERTINTOAdministration.Employees(EmployeeName,EmployeeNumber,DateHired)

VALUES(N’Clarice Simms’,N’971403′,N’20011112′);

GO

INSERTINTOAdministration.Employees

VALUES(N’928375′,N’Chuck Stansil’,N’20080628′);

GO

INSERTINTOAdministration.Employees

VALUES(N’792764′,N’Orlando Perez’,N’20000616′, 12.95);

GO

INSERTINTOAdministration.Employees(EmployeeName,EmployeeNumber,

‎ HourlySalary,DateHired)

VALUES(N’Gina Palau’,N’247903′, 18.85,N’20080612′);

GO

ROLLBACKTRANSACTIONAddEmployees;

GO

این کد ابتدا یک table به اسم Employee تشکیل میدهد. سپس از database engine درخواست اضافه کردن چند record میکند. تشکیل record ها در transaaction با استفاده از گزینه ی rollback انجام پذیر است.

دقت کنید که یک error در transaction وجود دارد

SQL SERVER آموزش

زمانی که کد بالا اجرا میشود table تشکیل میشود چون خارج transaction قرار دارد. ولی table نهایی خالی خواهد بود

SQL SERVER آموزش

به خاطر وجود یک error کل transaction رد خواهد شد
Controlling a Transaction’s Isolation Level

در database یک record آشفته (dirty ) نامیده خواهد شد , اگر پس از آخرین استفاده از table محتوای آن تغییر داده شود.

موقع تشکیل یک transaction شما میتوانید طوری database engine را تنظیم کنید که transaction را اجرا یا آن را رد کند. برای استفاده از این گزینه از فرمول زیر استفاده کنید:

SET TRANSACTION ISOLATION LEVEL

{ READ UNCOMMITTED

| READ COMMITTED

| REPEATABLE READ

| SNAPSHOT

| SERIALIZABLE

}

[ ; ]

ابتدا از SET TRANSACTION ISOLATION LEVEL استفاده کرده سپس از یک مقدار استفاده کنید

READ UNCOMMITTED : این مقدار از database درخواست میکند که record های را بخواند ولی آنها را اجرا نکند.

READ COMMITTED : این مقدار مشخص میکند که transaction , record های آشفته را از باقی transaction ها جدا کند و همچنین دسترسی آنها را از ان record قطع کند

Snapshot

serializable