PDA

View Full Version : قفل جداول



under22
جمعه 21 آذر 1393, 15:39 عصر
با اینکه active record قفل جدول نداره اما به راحتی میشه پیاده سازیش کرد .
ولی نمیدونم چرا اینطوری جواب منو دادن :
https://github.com/yiisoft/yii/issues/3666

arta.nasiri
جمعه 21 آذر 1393, 16:48 عصر
خب خودتون پیاده بکنید همونجا هم commit بکنید اگه واقعا بدرد بخور باشه و کدتون مشکلی نداشته باشه شما هم به جمع contributor ها می پیوندید. open source بودن یعنی این.

MMSHFE
شنبه 22 آذر 1393, 11:03 صبح
راستش یکم هم بنظرم برخوردشون بخاطر این بوده که مطلب رو به خوبی به زبان انگلیسی بیان نکردین. دقت کنید که تا وقتی طرف مقابل منظورتون رو به خوبی متوجه نشه، نمیتونه به درستی جواب بده و برخوردش مطابق با برداشتی هست که از پست شما داره. وقتی از یک زبان واسطه برای مکالمه استفاده میکنید، باید هردوطرف اون زبان واسطه رو به درستی و طبق قواعد مشخص شده اش بکار ببرین تا مشکلی پیش نیاد. این بنده خدا Alexander Makarov (همون کاربر Samdark توی پروژه Yii) آدم خیلی خوب و فعالیه و مستندات Yii رو هم اکثراً خودش نوشته (بخصوص توی Yii2) و ما بطور متوسط هر دو سه روز یکبار یکی دو ساعت با هم چت میکنیم درباره امکانات جدید Yii و بهم اطلاعات خوبی برای تولید پکیج Yii2 میده و حدسم اینه که منظورتون رو متوجه نشده. من یک پست دیگه گذاشتم و توضیح دادم تا متوجه بشه و ببینیم چه جوابی میده.

under22
شنبه 22 آذر 1393, 11:28 صبح
راستش یکم هم بنظرم برخوردشون بخاطر این بوده که مطلب رو به خوبی به زبان انگلیسی بیان نکردین. دقت کنید که تا وقتی طرف مقابل منظورتون رو به خوبی متوجه نشه، نمیتونه به درستی جواب بده و برخوردش مطابق با برداشتی هست که از پست شما داره. وقتی از یک زبان واسطه برای مکالمه استفاده میکنید، باید هردوطرف اون زبان واسطه رو به درستی و طبق قواعد مشخص شده اش بکار ببرین تا مشکلی پیش نیاد. این بنده خدا Alexander Makarov (همون کاربر Samdark توی پروژه Yii) آدم خیلی خوب و فعالیه و مستندات Yii رو هم اکثراً خودش نوشته (بخصوص توی Yii2) و ما بطور متوسط هر دو سه روز یکبار یکی دو ساعت با هم چت میکنیم درباره امکانات جدید Yii و بهم اطلاعات خوبی برای تولید پکیج Yii2 میده و حدسم اینه که منظورتون رو متوجه نشده. من یک پست دیگه گذاشتم و توضیح دادم تا متوجه بشه و ببینیم چه جوابی میده.
خودمم فکر میکنم کامل توضیح ندادم چون زبانم قوی نیست :لبخندساده:
پست شما رو دیدم کامل توضیح داده بودین .
شما با ایشون چت میکنین براشون توضیح بدین ممنون
استاد پکیچ Yii 2 رو شروع کردین ؟؟
تا کی طول میکشه ؟؟؟

MMSHFE
شنبه 22 آذر 1393, 11:40 صبح
خیر کار روی پکیج Yii2 رو بعد از تکمیل پکیج پیشرفته PHP شروع میکنم. فعلاً دارم مستندات لازم رو جمع آوری میکنم که به تسلط کافی برای تولید پکیج آموزشی برسم.

engmmrj
یک شنبه 23 آذر 1393, 19:01 عصر
اینا که نمی دونن lock table چیه چطوری yii رو توسعه میدن ؟

under22
یک شنبه 23 آذر 1393, 20:39 عصر
واقعا زشته یه فریمورک به این بزرگی همچین امکانی رو نداشته باشه وقتی هم بهشون بگی اینطوری جواب بدن

MMSHFE
دوشنبه 24 آذر 1393, 12:11 عصر
راستش این بنده خدا cebe (یا همون Carsten Brandt) کلاً یه همچین آدمیه. پستهاش رو توی GitHub بررسی کنید میبینید که زیاد آدم انتقادپذیری نیست. منظورم اینه که چند جای دیگه هم گفته که من این قابلیت رو اضافه نمیکنم و بعد یکی دیگه اومده اضافه کرده (اینم از امتیازات Open Source بودنه دیگه که نمیخواد منت افراد رو بکشین). بهرحال همه جا آدمهای خوب و بد هست. این آقا هم بهرصورت زحمت زیادی کشیده و تا حالا بیشتر از 4000 تا کامیت داشته توی Yii

قابلیت مذکور رو خودم اضافه میکنم. امیدوارم بدرد بخوره.

MMSHFE
دوشنبه 24 آذر 1393, 12:48 عصر
راستش بعد از مطالعه دقیق مستندات MySQL درمورد قفل کردن جداول (لینکهای زیر) :
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
http://dev.mysql.com/doc/refman/5.0/en/concurrent-inserts.html
http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html
http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-triggers.html
http://dev.mysql.com/doc/refman/5.0/en/lock-tables-restrictions.html
من هم به این نتیجه رسیدم که واقعاً قفل کردن جداول نیاز خیلی ضروری و حساسی نیست و واقعاً با توجه به ساختار فعلی MySQL باید با احتیاط به کار برده بشه. برای مثال وقتی شما فقط جدول t1 رو قفل میکنید، نمیتونید اطلاعات رو از جدول t2 بخونید (چون اون رو برای خودتون قفل نکردین). این مسئله هم توی ActiveRecord که مهمترین قابلیتش Relationها هست واقعاً اهمیت زیادی داره. اگه یک جا یادمون بره قفلی که گرفتیم رو آزاد کنیم هم مشکلات خاصی ممکنه پیش بیاد. ازطرفی قفل کردن جداول، Transaction Safe نیست و وقتی یک قفل رو میگیرین یا آزاد میکنید (LOCK TABLES یا UNLOCK TABLES)، تمام ترنزکشهای قبلی بطور ضمنی commit میشن. با این اوصاف باید بیشتر بررسی کنیم که وجود قفل واقعاً چقدر نیازه و اگه واقعاً نیاز ضروری باشه، بهتره متد براش بنویسیم یا همونطوری با کوئری دستی و ازطریق Yii::app()->db کار کنیم. دوستان لطفاً در این مورد مشارکت کنید.

MMSHFE
دوشنبه 24 آذر 1393, 13:02 عصر
https://github.com/yiisoft/yii/issues/3666#issuecomment-66966130

under22
دوشنبه 24 آذر 1393, 20:38 عصر
راستش بعد از مطالعه دقیق مستندات MySQL درمورد قفل کردن جداول (لینکهای زیر) :
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
http://dev.mysql.com/doc/refman/5.0/en/concurrent-inserts.html
http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html
http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-triggers.html
http://dev.mysql.com/doc/refman/5.0/en/lock-tables-restrictions.html
من هم به این نتیجه رسیدم که واقعاً قفل کردن جداول نیاز خیلی ضروری و حساسی نیست و واقعاً با توجه به ساختار فعلی MySQL باید با احتیاط به کار برده بشه. برای مثال وقتی شما فقط جدول t1 رو قفل میکنید، نمیتونید اطلاعات رو از جدول t2 بخونید (چون اون رو برای خودتون قفل نکردین). این مسئله هم توی ActiveRecord که مهمترین قابلیتش Relationها هست واقعاً اهمیت زیادی داره. اگه یک جا یادمون بره قفلی که گرفتیم رو آزاد کنیم هم مشکلات خاصی ممکنه پیش بیاد. ازطرفی قفل کردن جداول، Transaction Safe نیست و وقتی یک قفل رو میگیرین یا آزاد میکنید (LOCK TABLES یا UNLOCK TABLES)، تمام ترنزکشهای قبلی بطور ضمنی commit میشن. با این اوصاف باید بیشتر بررسی کنیم که وجود قفل واقعاً چقدر نیازه و اگه واقعاً نیاز ضروری باشه، بهتره متد براش بنویسیم یا همونطوری با کوئری دستی و ازطریق Yii::app()->db کار کنیم. دوستان لطفاً در این مورد مشارکت کنید.
حرف شما درسته Mysql هم تقریبا منطقی عمل کرده چونکه اگه شخصی بخاد برای مثال از جدولی بخونه و داخل جدول دیگه بنویسه اول میاد اطلاعات رو میخونه از جدول اول بعد میاد جدول دوم رو قفل میکنه و اطلاعات رو داخلش مینویسه حالا ممکنه نخایم از جدول اول بخونیم و داده ها رو از کاربر بگیریم فرقی نمیکنه مهم اینه که دستور insert رو داخل فقل مینویسیم .
به نظر من اگه بتونید همچین مکانیزمی مثل مثال پاینن بنویسید و ارائه بدید عالی میشه .


<?php
$post=Post::model()->find('postID=:postID', array(':postID'=>10))->lockread();
//وقتی کد میخاد اجرا بشه داخل اکتیو رکورد همچین کدی نوشته بشه
$sql="LOCK TABLES tablename READ;";
$sql.="SELECT * From tablename Where postID=:postID";
$sql.="UNLOCK TABLES;";
.....
?>

منظورم اینه که وقتی کاربر تابعی lockread رو صدا بزنه کوئری کاربر بین قفل قرار بگیره

MMSHFE
دوشنبه 24 آذر 1393, 20:57 عصر
خوب این درسته ولی حالا این رو درنظر بگیرین:

$post = Posts::model()->with('comments')->findByPk(10)->lock('read');
این روش قفل بنظرم بهتره (با یک تابع lock بشه قفل خوندن و نوشتن رو گرفت و نوع قفل رو توی پارامتر بهش بدیم. ولی با این اوصاف، باید این دستورات اجرا بشه:
LOCK TABLES `tbl_posts`,`tbl_comments` READ;
SELECT * FROM `tbl_posts` `t` LEFT OUTER JOIN `tbl_comments` `comments` ON (`comments`.`post_id`=`t`.`post_id`) WHERE (`t`.`id`='10');
UNLOCK TABLES;
منظورم اینه که الان که with داریم باید قفل برای اون جدول هم گرفته بشه تا بتونیم باهاش کار کنیم. توی دیتابیسهای بزرگ یکم پیچیده میشه. بررسی اینکه with هم داریم یا نه و کدوم جدولها رو باید توی قفل بگیریم هم خودش مسئله است. اینکه JOIN میخواد زده بشه یا با کوئریهای متعدد کار کنه (together رو false کردیم یا true هست) همه و همه مسائلی هست که باید درنظر گرفته بشه. تو ذهنم اومد که با criteria کار کنم ولی باز مشکل اینه که قاعدتاً طبق ساختار Yii باید اینطوری هم بتونیم صدا بزنیم:

$post = Posts::model()->lock('read')->findByPk(10)->with('comments');
همونطور که میبینید الان lock رو اول صدا زدیم و هنوز توی criteria بخشهای with و where و... پر نشده. میبینید چقدر پیچیدگی داره؟ گمونم cebe هم بخاطر همینا زیر بار نمیره. البته توی Yii2 با قفل گذاری منطقی خودش این مشکل رو دور زده.

under22
دوشنبه 24 آذر 1393, 21:15 عصر
یک تابع باشه و نوع قفل رو بگیره بهتره دیگه نیاز به دو تابع نیست .
این

Posts::model()->with('comments')->findByPk(10)->lock('read');
منظورتون متوجه نمیشم میگید تو دیتابیس های بزرگ پیچیده میشه . خب معلومه کاربر به چه تیبل هایی میخاد جوین بزنه اون ها رو هم تو قفل شرکت میدیم . اما اینکه ممکنه حالات دیگه پیش بیاد مثلا همین مثال شما

Posts::model()->lock('read')->findByPk(10)->with('comments');
دیگه پیاده سازی نکنیم تو توضیحات بنویسیم که اگه کاربر میخاد قفل کنه باید اینطوری استفاده کنه وگرنه اینطوری که شما میگید خیلی کار میبره و پیچیده میشه .
Yii 2 چطوری اومدهاین کار رو دور زده؟

MMSHFE
سه شنبه 25 آذر 1393, 16:21 عصر
خوب ببینید اگه قرار باشه استایل کاری Yii رو بهم بزنیم که خوب نیست. من تو ذهنم این بود که بیام سیستم ActiveRecord رو تغییر بدم به این نحو که یک شئ CDbCriteria داخلی داشته باشه هر دستوری مینویسیم، تغییرات رو توی اون Criteria ایجاد کنه و درنهایت، وقتی find و... اتفاق میفته Criteria واردعمل بشه و کوئریها رو بدیم به Yii::app()->db تا اجرا کنه. اینطوری کاربر هم اذیت نمیشه ولی بطور کلی باید معماری CActiveRecord رو یکم دستکاری کنیم که البته بد هم نیست ولی یکم زمان میبره.
درمورد نحوه کار Yii2 هم این لینک رو ببینید:
http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#optimisticLock%28%29-detail