Проблема в том, что в вашем коде есть условие гонки. Логически кажется, что ваш код выглядит следующим образом:
Open file
Repeat
Read record from file
Check if record exists in table
If no record in table
Add record to table
End repeat
Close file
Состояние гонки является то, что если у вас есть два процесса, выполняющиеся, каждый может проверить, если конкретная запись существует в таблице; оба возвращают возвращаемое значение, указывающее, что запись не существует; и оба будут потом вставлять запись. У вас, по-видимому, нет основного или уникального ограничения ключа в базе данных, чтобы предотвратить дублирование данных, и, таким образом, данные, вставленные каждым процессом, добавляются в таблицу.
Ситуация, с которой вы столкнулись, возникает из-за того, что два процесса не знают, что делают друг с другом. Каждый из них запланирован независимо и совместно использует процессор (ы) не только между собой, но и со всеми другими процессами, запущенными в одно и то же время, и их выполнение прерывается непредсказуемо, чтобы позволить другим процессам работать. Теперь, давайте рассмотрим следующий сценарий:
Process 1 starts
Process 2 starts
Process 1 issues an I/O request to read a record from the
file, relinquishing the CPU
Process 2 issues an I/O request to read a record from the
file, relinquishing the CPU
I/O for process 1 completes and process 1 is rescheduled for execution
I/O for process 2 completes and process 2 is rescheduled for execution
Process 2 executes, issues an SQL request to see if the record exists in the
table, and relinquishes the CPU
Process 1 executes, issues the same SQL request, and relinquish the CPU
SQL request for process 2 completes; process 2 is rescheduled for execution
SQL request for process 1 completes; process 1 is rescheduled for execution
Process 1 executes and finds the record does not exist in the file
Process 1 adds the record to the file
Process 2 executes and finds the record does not exist in the file
Process 2 adds the record to the file
Обратите внимание, что порядок выполнения процессов поменялся вокруг пару раз. Это нормально - у вас нет контроля над тем, какой процесс будет запланирован для исполнения, и вам не нужно заботиться об этом.
Каждый из ваших процессов правильно нашел, что запись из файла не существовала, когда она смотрела на базу данных и, таким образом, добавила ее. К сожалению, каждый из ваших процессов не знал, что другой процесс делает то же самое в более или менее то же самое время.
IMO Самое легкое, что нужно сделать, это заставить каждый процесс попытаться заблокировать файл, чтобы только он мог прочитать файл. Это помешало бы другим процессам считывать и обрабатывать данные из файла, тем самым предотвращая такую проблему. Похоже, вы используете VB.Net, поэтому вы можете использовать FileSystem.Lock для блокировки файла. Логический поток вашей программы будет изменен следующим образом:
Open file
Lock the file
- either wait until the file can be locked successfully or terminate because the
file is in use by another process
Repeat
Read record from file
Check if record exists in table
If no record in table
Add record to table
End repeat
Unlock the file
Close file
Удачи.
Посмотрите «состояние гонки». Удачи. –
У вас есть решение? –