View Full Version : ایجاد Transaction
Mohammad_Mnt
چهارشنبه 14 دی 1384, 20:43 عصر
من دو Table دارم که با هم رابطه دارن . وقتی رکوردی توی تیبل اول حذف می شه ، یه رکورد خاص هم باید از تیبل دوم حذف بشه .
من دستور اس.کیو.ال حذف رکورد تیبل دوم را توی متد BeforeDelete تیبل اول قرار دادم ولی می خوام که ای دو تا توی یه Transaction قرار بگیرن . اما نمیدونم که BeginTransaction و CommitTransaction رو کجا صدا بزنم
از ADO و MS-SQL هم استفاده می کنم
ممنون
vcldeveloper
پنج شنبه 15 دی 1384, 02:50 صبح
MS SQL Server از Cascade Deleteing پشتیبانی میکنه، یعنی می تونید ازش بخواید با حذف یک رکورد از جدول Master، تمامی رکوردهای مربوط به آن در جدولهای Slaves را بصورت خودکار حذف کند.
mzjahromi
پنج شنبه 15 دی 1384, 08:31 صبح
حرف آقای کشاورز درسته و ساده ترین راهه ولی Transaction هم می تونی به شکل زیر استفاده کنی
try
db.StartTransaction;
table1.delete;
db.commit;
except
db.Rollback;
End;
چون قبل از Delete کردن رکوردهای Slave هم Delete میشن پس همه عملیات تو تراکنش انجام میشه.
Mohammad_Mnt
پنج شنبه 15 دی 1384, 17:26 عصر
آقای کشاورز ، جدول های من مستر / دیتیلز نیستند
آقای ذوالقدر ، من می خوام از توی کد برنامه فقط متد Delete رو صدا بزنم و تراکنش توسط خود متد ایجاد بشه .
مرسی از کمکی که می کنین
mzjahromi
پنج شنبه 15 دی 1384, 17:32 عصر
خوب متد Delete رو طبق کدی که من نوشتم بنویس اگه مشکلی هست دقیقا بگو کجا
mzjahromi
پنج شنبه 15 دی 1384, 17:39 عصر
try
AdoConnection.BeginTrans;
Adotable1.delete;
AdoConnection1.CommitTrans;
except
AdoConnection1.RollbackTrans;
End;
Mohammad_Mnt
جمعه 16 دی 1384, 18:40 عصر
ببینین ، هر کجا که من بخوام delete رو صدا کنم باید همین کد ها رو بنویسم . وقتی هم که یه رکورد از طریق DataAware ها حذف می شه این کار جواب نمی ده .
من می خوام که فقط و فقط با صدا زدن متد delete از یک ADODataSet ، این تراکنش انجام بشه
مرسی
vcldeveloper
شنبه 17 دی 1384, 02:07 صبح
شما برای AdoDataSet رویدادی بنام OnBeforeDelete دارید که قبل از حذف هر رکورد توسط AdoDataSet فراخوانی میشه، می تونید کدتون را در رویداد OnBeforeDelete از DataSet اول بنویسید تا بتونید قبل از حذف رکورد مورد نظر، رکوردهای مربوط به اون در dataset های دیگه را در یک تراکنش حذف کنید. اگه تراکنش به هر دلیل موفقیت آمیز نبود، می تونید در همین رویداد تابع Abort را فراخوانی کنید تا عمل حذف در جدول اول هم اعمال نشه.
کدهای مربوط به تراکنش را هم که آقای ذولقدر براتون نوشتند.
Mohammad_Mnt
شنبه 17 دی 1384, 14:49 عصر
حالا اگه حذف توی جدول دوم موفقیت آمیز بود و توی جدول اول شکست خورد چی ؟ این طوری من رکوردهای جدول دوم رو بی دلیل حذف کرده ام !
mzjahromi
شنبه 17 دی 1384, 14:55 عصر
ببینید اگر تو Befor Delete تراکنش رو شروع کنی و تو Afterdelete تراکنش رو قطعی کنی اونوقت اگه تراکنش قطعی نشه کلیه عملیات انجام شده خنثی میشه فقط باید ببینیم کجا Rollback کنیم.
ولی کلا به نظر من این روش خیلی غیر استاندارد هستش. اگر واقعا این دو تا جدول به هم اینقدر وابسته هستن چرا بین اونا Relation نمیذاری و از Cascade delete استفاده نمیکنی
vcldeveloper
یک شنبه 18 دی 1384, 01:27 صبح
حالا اگه حذف توی جدول دوم موفقیت آمیز بود و توی جدول اول شکست خورد چی ؟ این طوری من رکوردهای جدول دوم رو بی دلیل حذف کرده ام !
اون موقع می تونید از دو تا تراکنش تو در تو استفاده کنید، یعنی تراکنش B را در تراکنش A ایجاد کنید؛ در داخل تراکنش B رکوردهای وابسته به رکورد اصلی را حذف کنید و در تراکنش A رکورد اصلی را. در صورتی که رکورد اصلی به درستی حذف نشه و تراکنش Rollback A بشه، تراکنش B هم Rollback میشه. البته همه RDBMS ها از تراکنش های تو در تو پشتیبانی نمی کنند.
البته باز هم منطقی ترین کار اینه که از Cascade Delete استفاده کنید و کنترل کار را به RDBMS بدید.
Mohammad_Mnt
یک شنبه 18 دی 1384, 12:39 عصر
خوب . من متد T1.Delete رو صدا می زنم . توی T1.BeforeDelete هم متد T2.Delete روصدا می زنم .
حالا : تراکنش داخلی توی T1.BeforeDelete ایجادمی شه . ولی تراکنش خارجی کجا ایجاد می شه ؟ در واقع BeginTransaction و CommitTransaction و RollBackTransaction رو باید کجاها قرار بدم ؟
Naficy
دوشنبه 19 دی 1384, 17:30 عصر
به نظر می یاد شما باید خیلی ساده یک متد Delete جدید بنویسید. به جای اینکه بخواین به زور با متد Delete فعلی این کار رو بکنین.
Mohammad_Mnt
پنج شنبه 11 خرداد 1385, 21:21 عصر
من دوباره به مشکل برخوردم
توی رویداد BeforeDelete نمی تونم از BeginTran استفاده کنم .
Cannot Start more transaction on this session
vcldeveloper
جمعه 12 خرداد 1385, 06:33 صبح
Cannot Start more transaction on this session
بعضی از نرم افزارهای موتور بانک اطلاعاتی فقط اجازه ایجاد یک تراکنش را به شما میدن و از تراکنش های تو در تو پشتیبانی نمی کنند.
Mohammad_Mnt
شنبه 13 خرداد 1385, 09:06 صبح
من با ADO و MSSQL کار می کنم . حالا راه حل چیه ؟
B_YAGHOBI
شنبه 13 خرداد 1385, 11:19 صبح
یک روش این است که کلیه عملیات اینچنینی خود را یک StoreProcedure کرده و داخل آن از Transaction استفاده کنید.
Mohammad_Mnt
شنبه 13 خرداد 1385, 13:51 عصر
چون من از کامپوننت های dataAware استفاده می کنم ( که یکی شون هم dbNavigator است ) نمی تونم از این روش که گفتین استفاده کنم
یه راه حل ساده تر پیدا کردم :
به جای این که از :
ADOConnection.BeginTrans;
ADOConnection.CommitTrans;
ADOConnection.RollBackTrans;
استفاده کنم از این ها استفاده کردم و مشکل حل شد :
ADOConnection.Execute('BEGIN TRAN MyTransaction');
ADOConnection.Execute('COMMIT TRAN MyTransaction');
ADOConnection.Execute('ROLLBACKTRAN MyTransaction');
Arminizer_88
دوشنبه 15 خرداد 1385, 09:49 صبح
منم با این راه حل آخر که mzjahromi گفتن موافقم. اینجوری بهتره اگه واقعا این دو جدول اینقدر به هم وابسته هستند.
Developer Programmer
یک شنبه 11 فروردین 1387, 12:40 عصر
تراکنش زیر رو در نظر بگیرید
BEGIN TRANSACTION
UPDATE table1
--Code for updating table1
...
--check error status
if @@error <> 0
ROLLBACK TRANSACTION
RETURN -100
چطور میشه از طریق دلفی فهمید که خطا رخ داده ؟ Try... Except ؟
vcldeveloper
دوشنبه 12 فروردین 1387, 01:47 صبح
چطور میشه از طریق دلفی فهمید که خطا رخ داده ؟ Try... Except ؟
این کد کجا نوشته میشه؟ اگه توی دلفی با استفاده از متدهای مربوطه نوشته بشه، بله می تونید با try-except اونو بگیرید. اما اگه توی یک SP نوشته شده، می تونید مقداری که SP بر میگردونه رو تنظیم کنید که برنامه از روی مقدار برگشتی SP بفهمه عملیات درست انجام شده یا نه.
Alen
چهارشنبه 03 مهر 1387, 12:30 عصر
سلام به همه دوستان
اينجا http://barnamenevis.org/forum/showthread.php?t=15494&highlight=begintransaction
خوندم كه تو شبكه اگه از transaction استفاده نكنيم بهتره
آيا واقعا اينطوره؟
اگه پاسخ مثبته پس معادل transaction چيست؟ و براي جلوگيري از ثبت ناقص و نادرست داده ها در جدول چه بايد كرد(در شبكه)؟
vcldeveloper
چهارشنبه 03 مهر 1387, 17:45 عصر
خوندم كه تو شبكه اگه از transaction استفاده نكنيم بهتره
آيا واقعا اينطوره؟
خیر، جواب داده شده دقیق نبود. باید گفته بشه که اگر از Transaction استفاده می کنید، سعی کنید کار را در کوتاه ترین زمان ممکن انجام بدید، مثلا یک Transaction درست نکنید، بعد منتظر ورودی کاربر وایستید! قبلا درباره اش توضیح داده شده. Transaction را جستجو کنید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.