Гриша К.
Новичок
Обновление данных в 2-х таблицах (MyISAM) БД. Возможна ли потеря данных при сбоях.
Добрый вечер : )
Запутался я сильно с транзакциями при изучении, с блокировками таблиц для MyISAM, и вообще с сохранением целостности данных для нетранзакционных таблиц, и возможно вопросы мои несколько не по теме сообщения получаются.
# К примеру есть каталог сайтов, в котором информация о сайтах сортируется в зависимости от кол-ва денежных средств оплаченных за размещение сайта (СТАВКА).
Информация о сайте и ставке содержится в таблице БД orders(orderid, customerid, site, rate)
# Пользователь имеет возможность не оплачивать сразу денежные средства для повышения ставки сайта, а хранить информацию о переведенных денежных средствах на счет фирмы, занимающейся данными услугами, непосредственно на сайте, т.е. клиент имеет СЧЕТ на сайте, с которого может списывать деньги в пользу повышения ставки сайта.
Информация о пользователе и его счете хранится в таблице БД customers(customerid, username, account)
# Пользователь может размещать несколько сайтов и изменять ставки для нескольких сайтов сразу.
Теоретический механизм данных операций следующий:
осуществляется запрос к БД в цикле, на одновременное обновление поля account (СЧЕТ) и rate (СТАВКА) в двух объединенных таблицах (по полю customerid) orders и customers
Практический механизм выглядит так:
ВОПРОСЫ:
(1) Возможно ли при таком варианте утеря данных, т.е. со счета клиента спишутся данные (customers.account), но в пользу ставки сайта не запишутся (orders.rate).
(2) Данную ставку получается может изменять только один пользователь, по сути другого такого потока быть не может. Возможно только, что модератор может к примеру изменять эту же ставку, например в качестве бонуса, тогда возможно есть смысл изменить некоторые строки так:
В документации MySQL (MYSQL - справочник по языку, Компания MySQK AB, Издательство Вильямс 2005), я читал про транзакции и атомарные операции, также читал что к примеру когда используется два запроса к базе данных, один к примеру списывает средства со счета сберкнижки, а другой зачисляет на счет чековой книжки, то используются специальные методы для нетранзакционных таблиц, чтобы данные не были утеряны, но там не написано про то, что если две таблицы объеденены.
Добрый вечер : )
Запутался я сильно с транзакциями при изучении, с блокировками таблиц для MyISAM, и вообще с сохранением целостности данных для нетранзакционных таблиц, и возможно вопросы мои несколько не по теме сообщения получаются.
# К примеру есть каталог сайтов, в котором информация о сайтах сортируется в зависимости от кол-ва денежных средств оплаченных за размещение сайта (СТАВКА).
Информация о сайте и ставке содержится в таблице БД orders(orderid, customerid, site, rate)
# Пользователь имеет возможность не оплачивать сразу денежные средства для повышения ставки сайта, а хранить информацию о переведенных денежных средствах на счет фирмы, занимающейся данными услугами, непосредственно на сайте, т.е. клиент имеет СЧЕТ на сайте, с которого может списывать деньги в пользу повышения ставки сайта.
Информация о пользователе и его счете хранится в таблице БД customers(customerid, username, account)
# Пользователь может размещать несколько сайтов и изменять ставки для нескольких сайтов сразу.
Теоретический механизм данных операций следующий:
осуществляется запрос к БД в цикле, на одновременное обновление поля account (СЧЕТ) и rate (СТАВКА) в двух объединенных таблицах (по полю customerid) orders и customers
Практический механизм выглядит так:
PHP:
/* $site_array - массив содержащий результат запроса select к БД на извлечение данных о клиенте и его сайтах (счет, ставка, url сайта) из 2-х объединенных таблиц orders [b]orders[/b] и [b]customers[/b]
*/
foreach ($site_array as $key => $value) {
// Проверка необходимых условий
/* Запрос к БД: в данном случае со счета клиента списывается 0.50$ и зачисляется в пользу ставки сайта 0.50$ */
$result = mysql_query("update customers, orders
set customers.account = '9.50', orders.rate = '0.50'
where customers.customerid = orders.customerid and orders.orderid = '$orderid'");
if (!$result) {
$error = 'Невозможно сохранить данные';
}
}
ВОПРОСЫ:
(1) Возможно ли при таком варианте утеря данных, т.е. со счета клиента спишутся данные (customers.account), но в пользу ставки сайта не запишутся (orders.rate).
(2) Данную ставку получается может изменять только один пользователь, по сути другого такого потока быть не может. Возможно только, что модератор может к примеру изменять эту же ставку, например в качестве бонуса, тогда возможно есть смысл изменить некоторые строки так:
PHP:
set customers.account = customers.account - 0.50, orders.rate = orders.rate + 0.50
В документации MySQL (MYSQL - справочник по языку, Компания MySQK AB, Издательство Вильямс 2005), я читал про транзакции и атомарные операции, также читал что к примеру когда используется два запроса к базе данных, один к примеру списывает средства со счета сберкнижки, а другой зачисляет на счет чековой книжки, то используются специальные методы для нетранзакционных таблиц, чтобы данные не были утеряны, но там не написано про то, что если две таблицы объеденены.
.