Как hobodave предложенный в комментарии, это возможно в некоторых клиентах (хотя не, по-видимому, mysql
утилита командной строки) для установки ограничения по времени для транзакции. Вот является демонстрационное использование ActiveRecord в Ruby:
require 'rubygems'
require 'timeout'
require 'active_record'
Timeout::timeout(5) {
Foo.transaction do
Foo.create(:name => 'Bar')
sleep 10
end
}
В этом примере, временные лимиты транзакции после 5 секунд и автоматически откатывается. (Обновление в ответ на комментарий hobodave: Если база данных займет больше чем 5 секунд для ответа, то транзакция будет откатываться, как только она делает — не раньше.), Если Вы хотели удостовериться, чтобы все Ваши транзакции испытали таймаут после n
секунды, Вы могли создать обертку вокруг ActiveRecord. Я предполагаю, что это также относится к самым популярным библиотекам в Java.NET, Python, и т.д., но я еще не протестировал их. (Если Вы имеете, отправьте комментарий к этому ответу.)
Транзакции в ActiveRecord также имеют преимущество того, чтобы быть безопасным если a KILL
выпущен, в отличие от транзакций, сделанных из командной строки. См. https://dba.stackexchange.com/questions/1561/mysql-client-believes-theyre-in-a-transaction-gets-killed-wreaks-havoc.
Это, кажется, не возможно осуществить максимальное время транзакции на стороне сервера, кроме через сценарий как тот, который я отправил в своем другом ответе.
Вы получаете сообщение об ошибке «Не удалось получить список каталогов», потому что FTP-клиент не получает список каталогов с сервера, скорее всего, из-за проблем с брандмауэром или сетью.
Протокол FTP был изобретен задолго до сетевых брандмауэров и трансляции сетевых адресов, и он использует отдельный командный канал и канал данных для связи.
Когда вы входите в систему, используется только командный канал.
Когда вы выполняете список каталогов, клиент и сервер сообщают друг другу по каналу команд, на каком IP-адресе и порту (60746 в вашем примере) канал данных должен быть динамически настроен для передачи данных списка каталогов.
Это сделано с помощью команды FTP PORT или PASV.
В вашем случае клиент выдает команду PASV, а сервер отвечает:
227 Вход в пассивный режим (109, xxx, xx, xxx, 237,74).
Первые 4 октета в скобках составляют IP-адрес, а последние два - номер порта (256 * 237 + 74 = 60746).
Вы запускаете FTP-сервер внутри виртуальной машины с сетевым адаптером в стиле NAT
, настроенным для виртуальной машины (в отличие от Мостовой
)? Тогда это, скорее всего, причина ваших проблем, потому что эти типы виртуальных машин обычно недоступны "извне", поскольку они имеют общий IP-адрес физического хоста.
Открыты ли порты 60000-65535 на сервере? В вашей конфигурации указан диапазон, который будет использоваться для пассивных подключений. Вы можете сузить его до более короткого диапазона, чтобы в брандмауэре требовалось меньше открытых портов.
1) Убедитесь, что ваша виртуальная машина работает в сетевом режиме Bridged
, чтобы вы получали IP-адрес от NAT вашего маршрутизатора, и вы не подвергались NAT дважды.
2) Вы должны включить параметр MasqueradeAddress
в конфигурации ProFTPd и введите свой общедоступный IP-адрес (попробуйте whatismyip.com )
3) Вы должны раскомментировать параметр «Пассивные порты» в конфигурации ProFTPd. Там два числа, они должны образовывать диапазон ОТ - ДО. Вы можете сделать диапазон намного меньше, если хотите.
3) Вам необходимо перенаправить следующие порты с вашего маршрутизатора на соответствующие порты FTP VM: 20, 21 и весь диапазон пассивных портов.