|
|
|
Как установить монопольную транзакцию в mysql?
|
|||
|---|---|---|---|
|
#18+
Небольшой пример, не реальная ситуация, а просто для понимания задачи: Файл test1.php mysqli_query($connect, 'START TRANSACTION'); mysqli_query($connect, 'SELECT @var:=value FROM userinfo WHERE id=1'); sleep(10); mysqli_query($connect, 'UPDATE userinfo SET value=@var + 1 WHERE id=1'); mysqli_query($connect, 'COMMIT'); Файл test2.php mysqli_query($connect, 'START TRANSACTION'); mysqli_query($connect, 'SELECT @var:=value FROM userinfo WHERE id=1'); mysqli_query($connect, 'UPDATE userinfo SET value=@var + 1 WHERE id=1'); mysqli_query($connect, 'COMMIT'); Есть две транзакции. Суть в том что они должны прочитать значение поля (value), увеличить его на 1 и записать результат обратно в это поле. Проблема в том, что эти транзакции не блокируют друг друга, а выполняются параллельно. В первом файле (test1.php) между чтением и записью значения есть функция sleep(10), которая заставляет программу ждать 10 секунд, перед выполнение следующих операций. Если сначало запустить файл test1.php, а потом сразу запустить test2.php, то в результате поле value увеличиться лишь на единицу. Это логично, ведь первый файл сначало прочитает значение и потом заснет на 10 сек, в то время как второй файл также прочитает это значение и сразу же увеличит его на 1. Спустя 10 сек. 'проснется' первый файл, который знает только старое значение и ничего не знает о новом. Увеличит его на 1 и обновит данные. То есть в итоге выполнения обоих файлов значеие увеличиться на 1, а не на 2. Мне же нужно, чтобы транзакции выполнялись поочередно. То есть пока не выполниться первая, вторая не сможет получить доступ к строкам испольемым в первой транзакции. Как можно изменить стандартное поведение, чтобы транзакции выполнялись последовательно одна за другой. Уровень изолированости транзакции изменить не могу (хостер не разрешает). Да и проблему это бы не решило, так как даже при уровне SERIALIZABLE второй файл тупо выдаст ошибку что записи заняты и прекратит свое выпонение, а не встанет в очередь, как мне нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 11:55 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=94&tid=1831475]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
45ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 369ms |

| 0 / 0 |
