Транзакция на несколько файлов
От: #John Европа https://github.com/ichensky
Дата: 11.09.18 14:01
Оценка:
Здравствуйте,

надо добавить информацию сначала в один файл, потом во второй,
если процесс оборвался перед записью во второй файл,
то изменения в первом файле должны откатиться, как такое можно реализовать?
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re: Транзакция на несколько файлов
От: BlackEric http://black-eric.lj.ru
Дата: 11.09.18 14:04
Оценка:
Здравствуйте, #John, Вы писали:

J>Здравствуйте,


J>надо добавить информацию сначала в один файл, потом во второй,

J>если процесс оборвался перед записью во второй файл,
J>то изменения в первом файле должны откатиться, как такое можно реализовать?

Что за файлы? Текстовые? Какой размер файлов? Можно ли их перезаписать целиком?
https://github.com/BlackEric001
Re: Транзакция на несколько файлов
От: Qulac Россия  
Дата: 11.09.18 14:13
Оценка:
Здравствуйте, #John, Вы писали:

J>Здравствуйте,


J>надо добавить информацию сначала в один файл, потом во второй,

J>если процесс оборвался перед записью во второй файл,
J>то изменения в первом файле должны откатиться, как такое можно реализовать?

А что делать, если откат в первом файле тоже не удался? Простой алгоритм защиты от сбоев здесь не поможет. Нужно что ни будь вроде Транзакционная NTFS
Программа – это мысли спрессованные в код
Re: Транзакция на несколько файлов
От: _Raz_  
Дата: 11.09.18 14:14
Оценка:
Здравствуйте, #John, Вы писали:

J>надо добавить информацию сначала в один файл, потом во второй,

J>если процесс оборвался перед записью во второй файл,
J>то изменения в первом файле должны откатиться, как такое можно реализовать?

Гуглить c# ntfs transaction
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[2]: Транзакция на несколько файлов
От: #John Европа https://github.com/ichensky
Дата: 11.09.18 15:16
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Что за файлы? Текстовые? Какой размер файлов? Можно ли их перезаписать целиком?


Текстовые Файлы ~1GB. Размер информации которая записывается: ~10KB.
Целиком — нет, т.к. размер файла относительно большой.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[2]: Транзакция на несколько файлов
От: #John Европа https://github.com/ichensky
Дата: 11.09.18 15:27
Оценка:
Здравствуйте, Qulac, Вы писали:

Q>А что делать, если откат в первом файле тоже не удался? Простой алгоритм защиты от сбоев здесь не поможет. Нужно что ни будь вроде Транзакционная NTFS


Похоже, что это не поддерживается в .net core ,
похоже придется писать в отдельный файл состояние транзакции,
а потом писать данные в файлы, и в случаи падения приложения,
откатывать данные из файла с состоянием транзакции.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re: Транзакция на несколько файлов
От: Слава  
Дата: 11.09.18 15:36
Оценка: +2
Здравствуйте, #John, Вы писали:

J>надо добавить информацию сначала в один файл, потом во второй, если процесс оборвался перед записью во второй файл, то изменения в первом файле должны откатиться, как такое можно реализовать?


Вам нужен журнал изменений, а вообще взяли бы вы sqlite. Руками это писать вы утомитесь.
Re[3]: Транзакция на несколько файлов
От: Qulac Россия  
Дата: 11.09.18 15:39
Оценка:
Здравствуйте, #John, Вы писали:

J>Здравствуйте, Qulac, Вы писали:


Q>>А что делать, если откат в первом файле тоже не удался? Простой алгоритм защиты от сбоев здесь не поможет. Нужно что ни будь вроде Транзакционная NTFS


J>Похоже, что это не поддерживается в .net core ,

J>похоже придется писать в отдельный файл состояние транзакции,
J>а потом писать данные в файлы, и в случаи падения приложения,
J>откатывать данные из файла с состоянием транзакции.

Гиморно, ведь сбой может произойти и при попытке откатить неудачную транзакцию и т.д. Лучше поискать что ни будь готовое. Если что на практике, восстановление бд, тоже оформляется в виде транзакции с записью в журнал, что бы при неудачной попытке восстановления её можно было бы повторить.
Программа – это мысли спрессованные в код
Re: Транзакция на несколько файлов
От: Shmj Ниоткуда  
Дата: 11.09.18 17:54
Оценка:
Здравствуйте, #John, Вы писали:

J>надо добавить информацию сначала в один файл, потом во второй,

J>если процесс оборвался перед записью во второй файл,
J>то изменения в первом файле должны откатиться, как такое можно реализовать?

Вам правильно порекомендовали выше заюзать ntfs-transaction или готовую СУБД вместо работы с файлами, где механизм транзакций поддерживается из коробки.

Но! В качестве разминки попробую предложить альтернативу. Итак:

1. К каждой записи добавляете проверку целостности (хеш). Т.е. считываете строку и можете проверить не оборвалась ли она на середине.

2. При запуске вашей проги проверяете конец файлов — корректные ли там данные (т.е. целостность). Если оборвалось — то урезает (Seek) до предыдущей записи. Проверять нужно и первый и второй файл.

3. Если сбой произошел штатно, т.е. завершение процесса не произошло (а, к примеру, файл был заблокирован другим процессом) — то это отлавливается исключениями.

Пока не вижу подводных камней, но к критике готов.
Отредактировано 11.09.2018 17:55 Shmj . Предыдущая версия . Еще …
Отредактировано 11.09.2018 17:54 Shmj . Предыдущая версия .
Re[2]: Транзакция на несколько файлов
От: BlackEric http://black-eric.lj.ru
Дата: 12.09.18 10:23
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Пока не вижу подводных камней, но к критике готов.


А если между запись в первый и второй файл закончилось место на диске или комп вырубился. Получается, что нужен еще отдельный файл журнала со списком хешей.
https://github.com/BlackEric001
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.