Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: транзакции mysql в PHP

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
san4es
Отправлено: 25 Ноября, 2008 - 13:38:21
Post Id


Частый гость


Покинул форум
Сообщений всего: 201
Дата рег-ции: Март 2008  
Откуда: СПб, Ломоносов


Помог: 0 раз(а)




прочитал что на время выполнения запроса можно заблокировать запись.
как я понял делается это с помощью механизма транзакций, а конкретно командой SET TRANSACTION. далее выполняем запросы, и даём команду COMMIT для сохранения изменений или ROLLBACK для отката.
делаю так
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $qwery = "START TRANSACTION";
  3. mysql_query($qwery);
  4. $qwery = "UPDATE ..."
  5. mysql_query($qwery);
  6. $qwery = "COMMIT";
  7. mysql_query($qwery);
  8. ?>
  9.  

так правильно будет?

(Отредактировано автором: 25 Ноября, 2008 - 14:08:16)

 
 Top
EuGen Администратор
Отправлено: 25 Ноября, 2008 - 14:07:47
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Во-первых, для включения механизма транзакций, насколько я помню, нужно всего лишь отключить автоматический COMMIT:

Далее, только InnoDB поддерживает транзакции, то есть storage-engine Вашей таблицы должен быть именно InnoDB
Для того, чтобы посмотреть его, выполните:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. SHOW CREATE TABLE `your_table`
  3.  

И, чтобы изменить, выполните:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. ALTER TABLE `your_table` ENGINE=InnoDB
  3.  


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
san4es
Отправлено: 26 Ноября, 2008 - 11:16:11
Post Id


Частый гость


Покинул форум
Сообщений всего: 201
Дата рег-ции: Март 2008  
Откуда: СПб, Ломоносов


Помог: 0 раз(а)




подскажите как правильно выполнить блокировку чтобы пользователи одновременно не получали доступ к записи. пробовал много вариантов ни один не помогает.
придумал примерно такое. не работает.
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.    $con=mysql_connect("localhost", "mail", "mail") or die("нет соединения с базой данных");
  3.     mysql_select_db("mail", $con);
  4.     $qwery = "LOCK TABLES email_list WRITE";
  5.     mysql_query($qwery);
  6.     $qwery = "START TRANSACTION";
  7.     mysql_query($qwery);
  8.  
  9.         $qwery = "SELECT * FROM email_list WHERE msguid=".$_GET['uid_msg']."";
  10.         $res = mysql_query($qwery);
  11.         if ($res)
  12.         {
  13.             $r=mysql_fetch_array($res);
  14.            
  15.             if ($r['agent_eml'] != 'n')
  16.             {
  17.                 echo "письмо отослано на -".$r['agent_eml'];
  18.                 $qwery = "ROLLBACK";
  19.                 mysql_query($qwery);
  20.             }
  21.             else
  22.             {
  23.                     $qwery = "UPDATE email_list
  24.                         SET agent_eml='".$_SESSION['uemail']."',
  25.                             msgstat = 'old'
  26.                       WHERE msguid=".$_GET['uid_msg']."
  27.                         AND agent_eml = 'n'";
  28.                   if  (mysql_query($qwery))
  29.                   {
  30.  
  31.                 if (send_mail($_SESSION['uemail'], "", "", "C:/htdocs/eml/".$_GET['uid_msg'].".eml") == 1)
  32.                     {
  33.                         echo "письмо отправлено";
  34.                         $imap = imap_open("{.su:143}INBOX", "t","t");
  35.                         imap_delete ($imap, $_GET['uid_msg'], FT_UID);
  36.                         imap_expunge($imap);
  37.                         imap_close($imap);
  38.                                      
  39.                         $qwery = "COMMIT";
  40.                         mysql_query($qwery);
  41.                     }
  42.                     else
  43.                     {
  44.                         echo "ошибка при отправке письма.";
  45.                         $qwery = "ROLLBACK";
  46.                         mysql_query($qwery);
  47.                     }
  48.                   }
  49.                   else
  50.                   {
  51.                         echo "ошибка при записи в бд. обновите список";
  52.                         $qwery = "ROLLBACK";
  53.                         mysql_query($qwery);
  54.                   }
  55.                 }
  56.         }
  57.         else
  58.         {
  59.             echo "попытка не удалась<br>";
  60.             display_button ($_GET['uid_msg']);
  61.             $_GET['uid_msg'] ='';
  62.         }
  63.        
  64.     $qwery = "UNLOCK TABLES email_list";
  65.     mysql_query($qwery);
  66.     mysql_close($con);
  67. ?>

(Отредактировано автором: 26 Ноября, 2008 - 12:08:03)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB