Тогда обновляйте последовательно. Транзакция на truncate и добавление 50к не должна создать проблем для хорошего сервера СУБД. Таблица не перегружена индексами?
Задача в теме была описана. Запустить интерактивный (не завершающийся сразу, требующий ввода от пользователя) процесс, и управлять вводом-выводом через сокет.
Наберитие "man unix", там в конце пример клиент-серверного приложения общающихся по unix-сокету. Весь man нельзя выложить, но вот пример:
spoiler
EXAMPLE
The following code demonstrates the use of sequenced-packet sockets for local interpro‐
cess communication. It consists of two programs. The server program waits for a connec‐
tion from the client program. The client sends each of its command-line arguments in
separate messages. The server treats the incoming messages as integers and adds them up.
The client sends the command string "END". The server sends back a message containing
the sum of the client's integers. The client prints the sum and exits. The server waits
for the next client to connect. To stop the server, the client is called with the com‐
mand-line argument "DOWN".
The following output was recorded while running the server in the background and repeat‐
edly executing the client. Execution of the server program ends when it receives the
"DOWN" command.
Example output
$ ./server &
[1] 25887
$ ./client 3 4
Result = 7
$ ./client 11 -5
Result = 6
$ ./client DOWN
Result = 0
[1]+ Done ./server
$
int
main(int argc, char *argv[])
{
struct sockaddr_un name;
int down_flag = 0;
int ret;
int connection_socket;
int data_socket;
int result;
char buffer[BUFFER_SIZE];
/*
* In case the program exited inadvertently on the last run,
* remove the socket.
*/
ret = connect (data_socket, (const struct sockaddr *) &addr,
sizeof(struct sockaddr_un));
if (ret == -1) {
fprintf(stderr, "The server is down.\n");
exit(EXIT_FAILURE);
}
/* Send arguments. */
for (i = 1; i < argc; ++i) {
ret = write(data_socket, argv[i], strlen(argv[i]) + 1);
if (ret == -1) {
perror("write");
break;
}
}
/* Request result. */
strcpy (buffer, "END");
ret = write(data_socket, buffer, strlen(buffer) + 1);
if (ret == -1) {
perror("write");
exit(EXIT_FAILURE);
}
/* Receive result. */
ret = read(data_socket, buffer, BUFFER_SIZE);
if (ret == -1) {
perror("read");
exit(EXIT_FAILURE);
}
/* Ensure buffer is 0-terminated. */
buffer[BUFFER_SIZE - 1] = 0;
printf("Result = %s\n", buffer);
/* Close socket. */
close(data_socket);
exit(EXIT_SUCCESS);
}
For an example of the use of SCM_RIGHTS see cmsg(3).
SEE ALSO
recvmsg(2), sendmsg(2), socket(2), socketpair(2), cmsg(3), capabilities(7), creden‐
tials(7), socket(7), udp(7)
COLOPHON
This page is part of release 5.00 of the Linux man-pages project. A description of the
project, information about reporting bugs, and the latest version of this page, can be
found at https://www.kernel.org/doc/man-pages/.
Illidan Stormrage, скорее всего устройства не поддерживают высокоскоростной интерфейс, попробуйте выгрузить модуль ehci, чтобы остался только ohci. Возможно стоит даже попробовать uhci. Я с таким не сталкивался, но, думаю, копать нужно в эту сторону.
Антон Шелестов, еще можете посмотреть скорость работы через "show profile", убедиться что exists отвратительная по производительности конструкция, т.к. выполняется для каждой строки и заменить ее join.
time_is_always_against_us, SHARE MODE никогда не использовал. Насколько знаю, это больше для сохранения целостности БД, если мы добавляем зависимые данные, а в это время данные от которых зависим могут быть удалены. Обычно, я решал это, либо не в СУБД, либо процедурой с exception. То, что вы описываете, обычно не решают на стороне СУБД. Мнения разнятся, но большинство считает, что логика должна лежать в одном месте, и как правило, это не СУБД.
Проверьте FOR UPDATE, там должны быть дополнительные параметры блокировки, вам в идеале нужно блочить только ячейку. При такой блокировке, другой SELECT легко пройдет, если в нем нет работы с этой ячейкой. Ну и, все засовывайте в одну транзакцию, блокировки снимаются и по окончанию транзакции тоже.
YakutD, и как правильно заметили, используйте оболочку для работы с git. Т.к. смотреть дерево и тем более решать конфликты в командной строке не удобно. IDE от JetBrains уже имеют встроенную отличную оболочку для git.
time_is_always_against_us, прочитайте про SELECT FOR UPDATE. И блочьте не всю таблицу, а только строку/столбец или лучше ячейку.
Будет медленнее, если много запросов на чтение не связанных с изменениями, тут нужно знать вашу ситуацию. Если будет напрягать, то можно разделить на таблицу с реальными данными, и на витрину (мат.вьюху), где будут данные с более низкой точностью, но доступные без блокировок.