2014-12-05 4 views
0

Недавно я получил сайт класса ASP. и получил странную проблему.asp вставить в базу данных повторяющиеся данные

Язык: ASP.

База данных: Oracle,

Когда я вставить в базу данных. в случае, если есть дублированные данные (здесь игнорировать первичный ключ setting.it оракула старой системы, мы бы лучше не изменить базу данных.) то есть Validate, прежде чем вставить в БД:

sql="select 1 from tablename where condition...." 
result=runsql(sql) 
if not result.eof then 
'here means DB has data already then we return false. and exit the function. 
exit function 
end if 

'Insert Into DB statement 

Я использую загрузка пакетного файла. означает, что файл имеет много записей. например, 50 записей. , тогда мы используем два компьютера, открываем этот сайт и нажимаем кнопку «Отправить», чтобы загрузить файл одновременно.

Мы обнаружили, что в базе данных есть несколько повторяющихся данных. Только часть из них, не все.

Я не знаю, что произошло. мы добавили проверку уже перед вставкой в ​​БД.

Может кто-нибудь мне это поможет?

Этот сайт не имеет нити что-то.

+0

Посмотрите «состояние гонки». Удачи. –

+0

У вас есть решение? –

ответ

0

Проблема в том, что в вашем коде есть условие гонки. Логически кажется, что ваш код выглядит следующим образом:

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 

Удачи.

+0

Спасибо вашему пациенту и ответьте на подробности. Извините за тот один вопрос о блокировке, другой компьютер загружает другой файл. только файл имеет дубликаты данных. если заблокировать файл, означает, что этот файл не может делиться для чтения. но мы загружаем разные файлы. этот путь в порядке? –

Смежные вопросы