Допустим, сервер API обращается к серверу SQL из запроса, соединение для сервера MySQL такое.

    @mysql_connect(HOSTNAME,DATABASE_USER, DATABASE_PASSWORD) or die('Could not connect to : ' . mysql_error());

    @mysql_select_db(DATABASE_NAME) or die( "<-----------------------Unable to select database------------------>");     

Есть ли способ определить, открыто ли уже соединение? Если он открыт, сделайте транзакцию sql.

Скажем, при доступе к таблице A, другой вызов API-запроса извне приходит и хочет получить доступ к таблице B.

Можно ли инициировать доступ к таблице B, пока операция с таблицей A все еще выполняется.

Другими словами, не дожидайтесь завершения доступа к Таблице A. Как только появится доступ к таблице B, запустите ее.

0
jason white 17 Сен 2012 в 11:28
Как указано в введении к главе руководства по PHP на mysql_* functions: Это расширение не рекомендуется для написания нового кода. Вместо этого mysqli или PDO_MySQL. См. Также Обзор API MySQL для получения дополнительной помощи при выборе MySQL API.
 – 
eggyal
17 Сен 2012 в 11:49

1 ответ

Лучший ответ

@jasonwhite Я считаю, что параллелизм обрабатывается на уровне СУБД, которая, в зависимости от рассматриваемой операции, уже поддерживает возможность одновременного выполнения двух операций. Если, например, первая операция была операцией SELECT , а вторая была операцией INSERT , обе могли быть выполнены одновременно. Фактически, независимо от типов операций, это было бы возможно, за исключением случаев, когда таблицы были связаны через ограничение внешнего ключа. Это связано с тем, что MySQL реализует блокировку таблицы во время операций, при которой он блокирует таблицу, пока над ней выполняется операция, а затем освобождает таблицу после завершения этой операции.

Что касается проверки того, существует ли уже соединение, вам потребуется реализовать метод singleton , который будет проверять, существует ли уже соединение. Если нет, создайте его и верните; если это так, верните существующее соединение. Это выглядело бы примерно так:

function getConnection() {
    global $conn; //I do not recommend using globals, rather create a class for this
    if(is_null($conn)) {
         $conn = mysql_connect(HOSTNAME,DATABASE_USER, DATABASE_PASSWORD) or die('Could not connect to : ' . mysql_error());    
         mysql_select_db(DATABASE_NAME) or die( "<-----------------------Unable to select database------------------>");
    }
    return $conn;        
}

AFAIK, у вас нет дальнейшего контроля над тем, будет ли одна операция ждать другой во время выполнения. Мои 0,02 доллара.

1
Tash Pemhiwa 17 Сен 2012 в 15:16
Привет, кто-то предлагает мне иметь две таблицы, одна таблица, а другая - дубликат. таким образом можно разделить операции чтения и записи. Это правда?
 – 
jason white
17 Сен 2012 в 18:58
Также tash, метод getconnection, если соединение уже открыто, используйте его повторно. Это уменьшит задержку для следующей операции?
 – 
jason white
17 Сен 2012 в 19:00
@jason, наличие двух таблиц, ИМО, безусловно, уменьшит проблемы с задержкой. Но как бы вы синхронизировали таблицы? Я думаю, что накладные расходы и повышенная сложность, вызванные этой настройкой, не стоят затраченных усилий. Что касается вашего второго комментария, это действительно уменьшило бы задержку, поскольку открытие соединения связано с некоторыми накладными расходами. Но я думаю, вы действительно заметите разницу только на сайтах с «высоким трафиком» (которые трудно определить).
 – 
Tash Pemhiwa
17 Сен 2012 в 20:19
Таш, ради аргумента, просто скажем, что у нас есть две таблицы, одна - оригинальная, а другая - дублированная, как мы можем быть уверены, что транзакция чтения и записи происходит одновременно с двумя таблицами?
 – 
jason white
18 Сен 2012 в 02:53
Что ж, к сожалению, я не думаю, что можно когда-либо гарантировать это.
 – 
Tash Pemhiwa
18 Сен 2012 в 13:43