- Регистрация
- 30.09.2016
- Сообщения
- 248
- Благодарностей
- 30
- Баллы
- 28
Привет, ребята! Может быть кто-то знает как извлечь строку из таблицы БД MySQL с удалением одним запросом стандартными средствами Зеннопостер? Написал парсер, он берет строку из БД одним запросом (стандартным кубиком), вторым запросом удаляет. Если запускаю в многопотоке, образуется множество дублей. Как с этим бороться, может быть кто подскажет? Если нет возможности сделать это стандартными средствами, подскажите как сделать это с применением С#.
т.е. мне нужно выполнить два элементарных запроса к БД:
SELECT * from table limit 1 и записать его в переменную. Желательно иметь возможность записать в несколько переменных если будет несколько колонок.
DELETE from table LIMIT 1
Мне подсказали, что есть 3 варианта:
вариант раз: локи на уровне шаба (Говорят нужно использовать код вида:
Моя твоя не понимайт! Куда его вставлять? В using? В C#? Там, где записано "//тут работа с бд берем запись и удаляем если надо" надо написать запрос к БД вида "SELECT * from table limit 1; DELETE from table LIMIT 1"?
вариант два: локи на уровне бд
Нужно испоьлзовать запросы вида START TRANSACTION; ... COMMIT; ?
У меня запрос на извлечение строки из БД делается одним кубиком, запрос на удаление этой строки - вторым кубиком. Для лока на уровне БД нужно впихнуть каким-то образом два запроса в один кубик? Например на C#?.. Но я в C# откровенно говоря не силен ((
вариант три: локи на уровне хранимой процедуры
Нашел решение тут http://zennolab.com/discussion/threads/mysql-vzjat-unikalnuju-stroku-i-obnovit-tranzakcija.36704/#post-335529
Моя его интерпретация сельского Вани:
1. на сервере БД MySQL - хранимая процедура.
Вопрос в том верна ли она и куда эту процедуру вставлять в MySQL.
2. В Zennoposter - два кубика.
C#
project.Variables["MySQLConnectString"].Value - что должно находится в этой переменной?
3. И кубик работы с БД
Зачем нужен кубир работы с БД, если мы прописали хранимую процедуру в БД? Она разве не является запросом?
Т.е. на понятийном уровне нужно:
1. Выполнить запрос взятия строки из таблицы БД и одновременно залочить строку, над которой работаю для других потоков.
2. Выполнить запрос удаления строки из БД.
Как это сделать?
Весь день просидел, ни к чему не пришел. Помогите пожалуйста!
т.е. мне нужно выполнить два элементарных запроса к БД:
SELECT * from table limit 1 и записать его в переменную. Желательно иметь возможность записать в несколько переменных если будет несколько колонок.
DELETE from table LIMIT 1
Мне подсказали, что есть 3 варианта:
вариант раз: локи на уровне шаба (Говорят нужно использовать код вида:
Код:
CommonCode.SyncObject){
//тут работа с бд берем запись и удаляем если надо
}
вариант два: локи на уровне бд
Нужно испоьлзовать запросы вида START TRANSACTION; ... COMMIT; ?
У меня запрос на извлечение строки из БД делается одним кубиком, запрос на удаление этой строки - вторым кубиком. Для лока на уровне БД нужно впихнуть каким-то образом два запроса в один кубик? Например на C#?.. Но я в C# откровенно говоря не силен ((
вариант три: локи на уровне хранимой процедуры
Нашел решение тут http://zennolab.com/discussion/threads/mysql-vzjat-unikalnuju-stroku-i-obnovit-tranzakcija.36704/#post-335529
Моя его интерпретация сельского Вани:
1. на сервере БД MySQL - хранимая процедура.
Код:
PROCEDURE ok_database.accnt_id()
MODIFIES SQL DATA
BEGIN
set @rid = -1;
START TRANSACTION;
SELECT * INTO @rid from table limit 1
DELETE from table LIMIT 1
SELECT @rid;
COMMIT;
END
2. В Zennoposter - два кубика.
C#
Код:
string query = "call ok_database.accoutn_id();";
string res = ZennoPoster.Db.ExecuteScalar(query,null,ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.MySqlClient,
project.Variables["MySQLConnectString"].Value);
return res;
3. И кубик работы с БД
Зачем нужен кубир работы с БД, если мы прописали хранимую процедуру в БД? Она разве не является запросом?
Т.е. на понятийном уровне нужно:
1. Выполнить запрос взятия строки из таблицы БД и одновременно залочить строку, над которой работаю для других потоков.
2. Выполнить запрос удаления строки из БД.
Как это сделать?
Весь день просидел, ни к чему не пришел. Помогите пожалуйста!
Последнее редактирование: