Как я объяснил в этой статье , картинка стоит 1000 слов.
Первый оператор SELECT считывает значение 50, а второй оператор SELECT читает значение 10, поскольку между двумя операциями чтения выполняется операция записи. был казнен.
Линеаризуемость означает, что изменения происходят мгновенно, и как только значение реестра записывается, любая последующая операция чтения найдет то же значение, если реестр не будет подвергаться каким-либо изменениям.
На этот раз у нас нет ни одного реестра или Единственный источник правды. Наша система использует асинхронную репликацию базы данных, и у нас есть основной узел, который принимает и чтение, и запись, и узел подписчика, используемый только для операций чтения.
Поскольку репликация происходит асинхронно, существует задержка между модификацией строки первичного узла и временем, когда подписчик применяет такое же изменение.
Одно соединение с базой данных изменяет баланс счета с 50 на 10 и фиксирует транзакцию. Сразу после этого вторая транзакция считывает данные с узла Follower, но поскольку репликация не применяла модификацию баланса, читается значение 50.
Следовательно, эта система не является линеаризуемой, так как изменения, по-видимому, не происходят мгновенно. Для того чтобы сделать эту систему линеаризуемой, нам нужно использовать синхронную репликацию, и операция ОБНОВЛЕНИЕ основного узла не будет завершена, пока узел подписчика также не применяет ту же модификацию.
Взглянув на javadoc для Builder , я думаю, вы могли бы предоставить EntityResolver через конструктор, который принимает XMLReader . Я бы по возможности не позволял парсеру загружать файлы из Интернета.
Это решает проблему:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Document document = factory.newDocumentBuilder().parse(is);