Nike59
Client
- Регистрация
- 05.08.2011
- Сообщения
- 122
- Благодарностей
- 122
- Баллы
- 43
Здарова! Не, не можем. Сильно надо?Привет, всем! Может кто поделиться RecaptchaSolution.dll?
В шаблоне не нашел, да и гугл только сюда отправляет. Хотел посмотреть, а без библы толку.Здарова! Не, не можем. Сильно надо?
LOCK TABLES tabl WRITE;
SELECT * FROM tabl WHERE op = '' AND city = 'minsk' LIMIT 1;
UPDATE tabl SET op = '1' WHERE user = '{-Variable.id-}';
UNLOCK TABLES;
Sql sqlConn = new Sql(project);
var cmd = sqlConn.Cmd();
//открываем сессию
cmd.Connection.Open();
//Блокируем таблицы: advertise на записть (WRITE) и phone на запись (WRITE)
cmd.DbLock("tabl WRITE");
//выполняем произвольное количество комманд в рамках сессии. Другие потоки не имеют доступ к БД пока она заблокирована
cmd.CommandText = String.Format("SELECT * FROM tabl WHERE op = '' AND cms = 'minsk' LIMIT 1;");
var reader = cmd.ExecuteReader();
while (reader.Read())
{
string dbuser = reader["user"].ToString();
string dbcity = reader["city"].ToString();
string dbop = reader["op"].ToString();
project.SendInfoToLog(string.Format("user: {0}, city: {1}, op: {2}", dbuser, dbcity, dbop));
}
//разблокировка всех таблиц
cmd.DbUnLock();
//закрываем сессию
cmd.Connection.Close();
Выполнение действия CSharp OwnCode: Блокировка таблиц. There is already an open DataReader associated with this Connection which must be closed first.
Не проверял, но может нужно закрыть ридер перез разблокировкой таблиц.Что я делаю не так?
ошибка:C#:Sql sqlConn = new Sql(project); var cmd = sqlConn.Cmd(); //открываем сессию cmd.Connection.Open(); //Блокируем таблицы: advertise на записть (WRITE) и phone на запись (WRITE) cmd.DbLock("tabl WRITE"); //выполняем произвольное количество комманд в рамках сессии. Другие потоки не имеют доступ к БД пока она заблокирована cmd.CommandText = String.Format("SELECT * FROM tabl WHERE op = '' AND cms = 'minsk' LIMIT 1;"); var reader = cmd.ExecuteReader(); while (reader.Read()) { string dbuser = reader["user"].ToString(); string dbcity = reader["city"].ToString(); string dbop = reader["op"].ToString(); project.SendInfoToLog(string.Format("user: {0}, city: {1}, op: {2}", dbuser, dbcity, dbop)); } //разблокировка всех таблиц cmd.DbUnLock(); //закрываем сессию cmd.Connection.Close();
Код:Выполнение действия CSharp OwnCode: Блокировка таблиц. There is already an open DataReader associated with this Connection which must be closed first.
reader.Close();
Спасибо, вы верно подсказываете и ещё было несколько ошибокНе проверял, но может нужно закрыть ридер перез разблокировкой таблиц.
C#:reader.Close();
Sql sqlConn = new Sql(project);
var cmd = sqlConn.Cmd();
//Переменная с названием таблицы
string tabl = project.Variables["tabl"].Value;
//открываем сессию
cmd.Connection.Open();
//Блокируем таблицы: advertise на записть (WRITE) и phone на запись (WRITE)
cmd.DbLock("{0} WRITE", tabl);
...
Сейчас вроде всё делаю верно. Кто-нибудь может подсказать как это победить?Компиляция кода Ошибка в действии "CS1501" "No overload for method 'DbLock' takes 2 arguments". [Строка: 9; Cтолбец: 5]
Если у тебя не ниже 7.2.0.0 можешь так (9 строка):опять затык( не могу вставить переменную с названием таблицы в код блокировки
C#:Sql sqlConn = new Sql(project); var cmd = sqlConn.Cmd(); //Переменная с названием таблицы string tabl = project.Variables["tabl"].Value; //открываем сессию cmd.Connection.Open(); //Блокируем таблицы: advertise на записть (WRITE) и phone на запись (WRITE) cmd.DbLock("{0} WRITE", tabl); ...
Сейчас вроде всё делаю верно. Кто-нибудь может подсказать как это победить?
cmd.DbLock($"{tabl} WRITE");
опять затык( не могу вставить переменную с названием таблицы в код блокировки
C#:Sql sqlConn = new Sql(project); var cmd = sqlConn.Cmd(); //Переменная с названием таблицы string tabl = project.Variables["tabl"].Value; //открываем сессию cmd.Connection.Open(); //Блокируем таблицы: advertise на записть (WRITE) и phone на запись (WRITE) cmd.DbLock("{0} WRITE", tabl); ...
Сейчас вроде всё делаю верно. Кто-нибудь может подсказать как это победить?
cmd.DbLock(string.Format("{0} WRITE", tabl));
// или
cmd.DbLock(tabl + " WRITE");
// или начиная с 7.2.0.0
cmd.DbLock($"{tabl} WRITE");
Sql sqlConn = new Sql(project); //Подключаемся к БД
var cmd = sqlConn.Cmd();
cmd.Connection.Open(); //открываем сессию
string tabl = project.Variables["tabl"].Value;
//Блокируем таблицы: advertise на записть (WRITE) и phone на запись (WRITE)
cmd.Parameters.AddWithValue("@tabl", tabl);
cmd.DbLock("@tabl WRITE");
cmd.DbUnLock(); //разблокировка всех таблиц
cmd.Connection.Close(); //закрываем сессию
"com_es"- Название базы данныхВыполнение действия CSharp OwnCode: Блокировка таблиц. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''com_es' WRITE' at line 1
может так ?Запоздалая благодарность автору за статью! Но как известно, лучше поздно чем никогда)
Сейчас расскажу вам грустную историю:
Месяц назад я на притяжение 3 дней тратил свободное время на создание кубика для работы с базой данных в многопотоке(с# и mysql знаю очень поверхностно). Кое-как осилил я этот труд и сделал прекрасный шаблончик на базе этого сниппета. Пару недели шаблон чик трудился верой и правдой, потом я переустановил Винду и до запуска шаблона руки не доходили. Параллельно делал несколько шаблонов схожей тематики и регулярно заглядывал в вышеуказанные шаблон, чтобы освежить в памяти и полученные знания и сделать по подобию.
Три дня назад решил, что хватит шаблону простаивать и надо запускать его в работу, но не тут-то было. По каким-то причинам весь C# сниппет был удалён. Я по матерился, но не стал отчаиваться. Сделал раз, сделаю и два. Второй раз будет проще, думал я. Вот наивный!
Уже 2 дня мучаюсь с одной проблемой, не могу в код передать название базы данных для блокировки из переменной шаблона. При том что точно помню что тогда делал так, как и сейчас.
Пожалуйста помогите, вообще не понимаю что не так!?
Ошибка:Проблемный кусок:Sql sqlConn = new Sql(project); //Подключаемся к БД var cmd = sqlConn.Cmd(); cmd.Connection.Open(); //открываем сессию string tabl = project.Variables["tabl"].Value; //Блокируем таблицы: advertise на записть (WRITE) и phone на запись (WRITE) cmd.Parameters.AddWithValue("@tabl", tabl); cmd.DbLock("@tabl WRITE"); cmd.DbUnLock(); //разблокировка всех таблиц cmd.Connection.Close(); //закрываем сессию
"com_es"- Название базы данных
Как мне кажется я попробовал уже все варианты.
Ты не представляешь как мне стыдно Хоть убейте, не помню что я уже это спрашивал. Написал модераторам, чтобы удалили этот позор.может так ?
$"{tabl} WRITE"
ничего тут такого нет. все мы забываем , кто то больше кто то меньше.Ты не представляешь как мне стыдно Хоть убейте, не помню что я уже это спрашивал. Написал модераторам, чтобы удалили этот позор.
Так стыдно, хоть на форуме не появляйся
Последнее время было куча проблем, башка вообще не своя
Спасибо посмотрю, что там за органайзерничего тут такого нет. все мы забываем , кто то больше кто то меньше.
как то тут на форуме увидел скрины проги AllMyNotes Organizer и теперь тоже все пишу в нее. все снипеты, идеи, контакты клиентов... ну вот прям все. жить и разрабатывать стало проще
Как нужно поступить в этом случае?Выполнение действия CSharp OwnCode: Блокировка таблиц. Table 'cop' was locked with a READ lock and can't be updated
Блокируйте таблицу только на момент получения значения.Чтобы из таблицы не брались дубли в моём случае нужно блокировать на чтение. Но если я так делаю я не могу поменять флаг, чтобы отметить строку как в работе
Как нужно поступить в этом случае?
Так я вроде так и делаю. Вот код:Блокируйте таблицу только на момент получения значения.
1. Заблокировали таблицу.
2. Получили запись.
3. Установили свой флаг (допустим 'busy'), чтобы никакой другой поток уже не взял эту запись.
4. Сняли блокировку таблицы.
И так каждый поток.
Когда отработали с этой записью, опять тот же цикл чтобы допустим установить для готовой записи флаг 'good'.
Sql sqlConn = new Sql(project); //Подключаемся к БД
var cmd = sqlConn.Cmd();
string tabl = project.Variables["tabl"].Value;
//Блокируем таблицы:
cmd.DbLock($"{tabl} REAT");
//проверяем наличие заданий к выполнению (со статусом "execute"):
var reader = cmd.ExReader(String.Format("SELECT domain FROM {0} WHERE cms='wordpress' AND openreg=0 LIMIT 1;", project.Variables["tabl"].Value));
if(reader.HasRows) //проверяем имеются ли данные в ответе. Если имеются, то переходим к считыванию
{
while (reader.Read()) // построчно в цикле (while) считываем данные. Получим максимум 1 строку, т.к. в запросе стоит LIMIT 1
{
string dbdomen = reader["domain"].ToString(); //получаем id строки в БД, чтобы потом поменять статус задания
project.Variables["donor"].Value = dbdomen; //сохраняем link в переменную зеннопостера
}
}
reader.Close();
//Обновление статуса. Выполняется только если было получено задание (если id не пустое!)
if(!string.IsNullOrEmpty(project.Variables["donor"].Value))
{
//после получения задания необходимо поменять статус задания, чтобы другие потоки больше его не видели после разблокировки таблицы
cmd.ExNonQ(String.Format("UPDATE {0} SET openreg = 1 WHERE domain = '{1}';",project.Variables["tabl"].Value, project.Variables["domain_tp_vr"].Value));
}
cmd.DbUnLock(); //разблокировка всех таблиц
cmd.Connection.Close(); //закрываем сессию
Так вы блокируете таблицу на чтение "READ" и пытаетесь внести изменения.Поменял:
cmd.DbLock($"{tabl} READ");
на
cmd.CommandText = $"LOCK TABLES {tabl} READ;";
cmd.ExecuteNonQuery();
Никакого эффекта, таже самая ошибка
Я думал что блокировка ещё для других потоков.Так вы блокируете таблицу на чтение "READ" и пытаетесь внести изменения.
Блокируйте на "WRITE".
p.s. Не часто заглядываю.
Так и есть.Я думал что блокировка ещё для других потоков.
Никакого глюка.Тем более, какая разница чтение или запись? Мне же нужно сначала взять а потом изменить, то есть сначала Прочитайте а потом записать. Это какой-то глюк.
Если ставите WRITE блокировку то не должно быть дублей.При блокировке записи, в многопотоке почему-то получаются дубли
Так не желательно делать.Подскажите как изменить тестовый шаблон, чтобы соединение создавалось один раз при старте проекта и закрывалось на good/ban end.
Мудрил с Context вот так:
project.Context["sqlConn"] = new Sql(project);
var sqlConn = project.Context["sqlConn"];
var cmd = sqlConn.Cmd();
но вылетает ошибка:
"MySql.Data.MySqlClient.MySqlCommand" не содержит определения для "ExReader"
подскажите как поправить
большое спасибо за разъяснение))Так не желательно делать.
Одна из причин.
Вы создали подключение, получили данные из БД, потом их обрабатываете к примеру 3 минуты, а за это время mysql сервер из-за простоя разорвёт соединение, не спрашивая и не предупреждая клиента.
И когда клиент опять запросит данные, то получит ошибку подключения.
Это сделано на тот момент, если клиент упал не закрыв соединение.
И для оптимизации сервера, если не обращаются длительное время, то нет смысла занимать пул соединения.
p.s. У меня в одном большом проекте так сделано (с костылями), и это не хорошо, но там уже что-то менять поздно. Много придётся переделывать.
Кстати в C# подключение очень дешёвая операция, это только самое первое подключение чуть затратно (может пару секунд) остальные подключения мгновенные.