Ваши команды противоречат.
Если files.file_id
определено UNIQUE
(или PRIMARY KEY
), вам не нужно LIMIT 1
. И вам вообще не нужна явная блокировка. Просто запустите UPDATE
, поскольку во всей транзакции затрагивается только одна строка, тупиковая ситуация невозможна. (Если нет побочных эффектов от триггеров или правил или задействованных функций.)
Если files.file_id
не UNIQUE
(как кажется), то UPDATE
может влиять на несколько строк в произвольном порядке и только один из них заблокирован, рецепт для тупиков. Тогда более неотложная проблема заключается в том, что запрос не выполняет то, с чего вы, похоже, хотите начать.
Лучшее решение зависит от недостающей информации. Это будет работать:
UPDATE files
SET ...
WHERE primary_key_column = (
SELECT primary_key_column
FROM files
WHERE file_id = 123
LIMIT 1
-- FOR UPDATE SKIP LOCKED
);
Нет BEGIN;
и COMMIT;
, необходимых для одной команды, в то время как автоматическая фиксация по умолчанию включена.
Возможно, вы захотите добавить FOR UPDATE SKIP LOCKED
(или FOR UPDATE NOWAIT
) , чтобы пропустить или сообщить об ошибке, если строка уже заблокирована.
И вы, вероятно, захотите добавить предложение WHERE
, которое позволит избежать повторной обработки одной и той же строки.
Подробнее здесь:
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
Должен решить к C:\Documents and Settings\All Users\Application Data\
Оттуда, сделайте подпапки, такие как MyCompany\MyApp
Если Вы используете.NET, Приложение. CommonAppDataPath должен работать. Также удостоверьтесь, что виртуализация выключена для Вашего приложения
Простая победа API: SHGetFolderPath с CSIDL_COMMON_APPDATA
как тип папки.
Если Вы используете.NET, Приложение. CommonAppDataPath должен работать.
%ALLUSERSPROFILE %\Application Data\App
это - вероятно, единственный каталог, к которому все пользователи могут получить доступ без поднятых полномочий.
Если пользователи не собираются изменять данные непосредственно, и они будут только изменены приложением, как насчет IsolatedStorage - http://msdn.microsoft.com/en-us/library/3ak841sy (По сравнению с 80) .aspx
Средства проверки дают жизненное представление, чтобы сделать это в C или C++. Таким образом, я проголосовал за его ответ.
Вот детали, которые он не учел:
// assumes
// company is a pointer to a character sting containing company name
// appname is a pointer to a character string containing application name
// fname is a pointer to a character string cintaining name of file to be created
#include <shlobj.h> // for SHGetFolderPath
#include <direct.h> // for _mkdir
char path[MAX_PATH];
SHGetFolderPath(NULL,CSIDL_COMMON_APPDATA,NULL,NULL,path);
strcat(path,"/");
strcat(path,company);
_mkdir(path);
strcat(path,"/");
strcat(path,appname);
_mkdir(path);
strcat(path,"/");
strcat(path,fname);
// path is now a character string which can passed to fopen