Java sql batchupdateexception - IT Справочник
Llscompany.ru

IT Справочник
6 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java sql batchupdateexception

java.sql.BatchUpdateException – How to resolve Batch Update Exception

Posted by: Aldo Ziflaj in BatchUpdateException October 13th, 2014 1 Comment Views

In this example I will discuss about BatchUpdateException and how to resolve it. This exception is thrown when an error occurs during a batch update operation. It provides (among others) the update counts for all commands that were executed successfully during the batch update.

The BatchUpdateException class is a subclass of SQLException , which represents an exception that provides information on a database access error or other errors.

The BatchUpdateException exists since JDK1.2.

The structure of BatchUpdateException

Constructor:

    BatchUpdateException()

Constructs a BatchUpdateException instance.
BatchUpdateException(int[] updateCounts)

Constructs a BatchUpdateException object initialized with a given updateCounts.
BatchUpdateException(int[] updateCounts, Throwable cause)

Constructs a BatchUpdateException object initialized with a given cause and updateCounts.
BatchUpdateException(String reason, int[] updateCounts)

Constructs a BatchUpdateException object initialized with a given reason and updateCounts.
BatchUpdateException(String reason, int[] updateCounts, Throwable cause)

Constructs a BatchUpdateException object initialized with a given reason, cause and updateCounts.
BatchUpdateException(String reason, String SQLState, int[] updateCounts)

Constructs a BatchUpdateException object initialized with a given reason, SQLState and updateCounts.
BatchUpdateException(String reason, String SQLState, int[] updateCounts, Throwable cause)

Constructs a BatchUpdateException object initialized with a given reason, SQLState,cause, and updateCounts.
BatchUpdateException(String reason, String SQLState, int vendorCode, int[] updateCounts)

Constructs a BatchUpdateException object initialized with a given reason, SQLState, vendorCode and updateCounts.
BatchUpdateException(String reason, String SQLState, int vendorCode, int[] updateCounts, Throwable cause)

Constructs a BatchUpdateException object initialized with a given reason, SQLState, vendorCode cause and updateCounts.
BatchUpdateException(Throwable cause)

Constructs a BatchUpdateException object initialized with a given cause.

The BatchUpdateException in Java

Before witnessing when the exception is thrown, create a database, a table and put some data in it with this query:

Now we can go on simulating the exception. To do this, create a class called ExceptionThrownExample with this source code:

First thing you would want to do is replace my public static final credentials with your own.

I created a prepared statement that inserts data into the database, then I added a record with ID of 1. This will throw the exception, since there is a duplication of ID (Bruce Scott has the ID 1).

When this is executed, it will throw the exception:

Catching a BatchUpdateException

On the above example, the BatchUpdateException was caught by the last catch clause, since it is a subclass of SQLException . You can manually catch it before it reaches the SQLException . The following code acts on the same database (with 3 records) and shows how to catch the BatchUpdateException .

The above example is a modified version of the first one, which tries to add the same record with id 1 and 6. In the catch clause I caught the BatchUpdateException and got the data that it holds using the getUpdateCounts() method. Then, all I did was outputing what the method gave.

Predictable, since the first request, that of adding a 6th record, is legitimate and no errors are generated, while the second request, that of adding a 1st record, is wrong, since there is a record with ID 1 and IDs are unique per each record.

More about BatchUpdateException

The BatchUpdateException is thrown when an error occurs during a batch update operation. In addition to the information provided by SQLException , a BatchUpdateException provides the update counts for all commands that were executed successfully during the batch update, that is, all commands that were executed before the error occurred. The order of elements in an array of update counts corresponds to the order in which commands were added to the batch.

Java BatchUpdateException в SQL обработке

Следующий код дает BatchUpdateException , и я понятия не имею, почему.

Ошибка, которую я вижу в своем журнале: :

INFO JdbcLogging:25-Dit trad op bij het uitvoeren van de batchtaak (contactMoments): java.sql.BatchUpdateException: у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом ‘index(iddocument,chapter,chapterdate)values (44, ‘Examen; * Verdedigen project’, » в строке 1

Поэтому кажется, что в последнем обновлении мне не хватает некоторых данных. Данные я хочу написать не спроста (я проверил с системой рисунком «printline».

Любые предложения были бы более чем приветствуются.

2 Ответа

index является зарезервированным словом и не должно использоваться для имени таблицы. В вашем запросе поместите слово » index ` в `back quotes` и выполните, тогда он должен работать.

Попробуйте добавить пробел между двумя строками SQL-слово ) и слово values должны быть разделены.

Точно так же не помешало бы попробовать добавить пробел между index и ( — это просто зависит от того, насколько придирчив интерпретатор SQL.

Кроме того, index -плохое имя для таблицы, так как индекс имеет особое значение во многих базах данных. Я предполагаю, что index -это имя вашей таблицы, и вы на самом деле не пытаетесь вставить данные в индекс!?

Наконец, не уверен, что вам нужно ; в конце заявления? Обычно это не требуется при создании такого кода, поэтому, возможно, сначала попробуйте без него и, возможно, добавьте его позже, если у вас все еще есть проблемы.

Похожие вопросы:

Когда у меня есть BatchUpdateException в результате нарушения уникального ограничения, есть ли способ определить, какая запись в пакетной вставке нарушена? Например, предположим, что я выполняю.

У меня есть приложение, которое обрабатывает очень большой файл и отправляет данные в базу данных oracle (используя Java 6, oracle 9). В цикле я использую PreparedStatement ps и создаю все операторы.

Я использую Postgres 9.3, Spring и Java. Для BatchUpdateException из javadoc: После того, как команда в пакетном обновлении не выполняется должным образом и выдается BatchUpdateException , драйвер.

Я работаю над проектом обработки. Я попытался установить громкость звука, воспроизводимого с помощью библиотеки minim. ( setVolume кажется, не поддерживается, и setGain не имеет никакого эффекта).

Я пишу программу Clojure, используя clojure.java.jdbc. Я использую DBCP для объединения соединений с HSQL 2.2.8. У меня есть блок (транзакция), в котором я проверяю, существует ли схема, а если нет.

Я пытаюсь вставить вопрос в таблицу вопросов и получить этот последний вопрос id . Я пытаюсь добавить параметры для него в другой таблице с именем select_op . Он вставляет вопрос успешно, но не.

Это скорее проверка. На страницах учебника Oracle/Java , таких как этот , я продолжаю видеть укажите прямо рядом с catch , как если бы это был другой оператор с некоторыми функциональными.

Я получаю это BatchUpdateException из заявления stmt.executeBatch(): BatchUpdateException: A resultset was created for update В интернете нет никакой информации об этом исключительном сообщении. Что.

Читать еще:  Java arraylist indexof

почему мы используем ‘Throws IOException’ в обработке файлов java. я имею в виду, какова цель использования этих двух слов в обработке файлов?? Пожалуйста помочь.

У меня возникли некоторые проблемы с этим. Я пытаюсь перечислить некоторые данные о запросах, которые потерпели неудачу во время executeUpdate(), и я прочитал, что BatchUpdateException можно.

JDBC — How to solve java.sql.BatchUpdateException: String or binary data would be truncated.

Recently I was working in Java application which uses Microsoft SQL Server at its backend. The architecture of Java application was old i.e. even though there was heavy database communication back and forth there was no ORM used e.g. no Hibernate, JPA, or Apache iBatis. The Java application was using old DAO design pattern, where the DB related classes which are responsible for loading and storing data from database was calling stored procedure to do their Job. These stored procedure takes data from Java application and insert into SQL Server tables. One day, one of my collegue called me to troubleshoot «java.sql.BatchUpdateException: String or binary data would be truncated», which it’s application was throwing and he has no clue whatsoever that what is wrong with the data he is getting from other system and trying to store.

The stacktrace look like below:
java.sql.BatchUpdateException: String or binary data would be truncated.
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeBatch(Unknown Source)

When I saw the stacktrace I took big sigh because there was no mention of attribute or column which is failing the JDBC call. To make things worse, it was coming from a batch i.e. there could be 100 records in a batch and out of those 100 records, each having more than 80 fields, one of the field is throwing error.

In this article, I’ll explains how I troubleshoot the problem and fixed the issue only after my collegue promise me a lunch 🙂

Cause of java.sql.BatchUpdateException: String or binary data would be truncated:

The error was quite general if you have worked in SQL Server and it was coming from JDBC driver. The reason for this error was trying to store value larger than the column can allow e.g. if a column is declared as char(1) and you are trying to store a String more than one character e.g. «DEFAULT» then this error will occur. A similar error can occur in the case of the numeric data type where the value is larger than what the datatype of a particular column can allow. You can also see T-SQL fundamentals or Querying Microsoft SQL Server to learn more about «String or binary data would be truncated» error in SQL Server.

Solutionof java.sql.BatchUpdateException: String or binary data would be truncated:

Obviously, the solution is to find and fix the code which is trying to do that. Sometimes it’s data fault where you genuinely got the bad data e.g. for a field which can accept «Y» and «N» , you got the «Yes» or «No», but most of the time it’s your code which is doing the wrong thing. To find out the actual cause, I asked him if he had made any change in DAO layer. He told me that he has added a new field. That was enough for me to troubleshoot, I asked what are the places he has made changes and he told me 18 Java files and bunch of stored procedures. That was too many to look each of them, but we had to.

The next step was to minimize the search and locate the problem, so I asked which stored proc is called when this batch is stored into DB, he point me to the stored procedure and when I looked at it closely, I spotted the error. It was a a classic case of human error while updating a stored procedure and we are storing the value of another VARCHAR variable into a char(1) field. Since both values are quite similar, we didn’t realize until we checked every single field.

Spring JdbcTemplate batchUpdate() Example

Spring JdbcTemplate batch insert, batch update and also @Transactional examples.

  • Spring Boot 2.1.2.RELEASE
  • Spring JDBC 5.1.4.RELEASE
  • Maven 3
  • Java 8

1. Batch Insert

1.1 Insert a batch of SQL Inserts together.

1.2 If the batch is too big, we can split it by a smaller batch size.

2. Batch Update

2.1 Same to SQL update statement.

2.2 Update by batchSize.

3. Run

3.1 Create a table to test the batch insert and update.

4. @Transactional

4.1 With @Transactional , any failure causes the entire operation to roll back, none of the books will be added.

4.2 Try batch insert a 1000 books, the #500 contains an error, and the entire batch will be rolled back, no book will be inserted.

Download Source Code

References

mkyong

Comments

Please suggest how to rollback an insert if an exception occurred while inserting data using Spring JdbcTemplate batchUpdate() method.

Article is updated with @Transactional roll back example, please refer to #4 example

Hi, Using Spring JDBC batch update, How to handle the scenario like what if a row failed to insert ? Suppose out of 1000 rows to be inserted, the 100th row failed to insert and the program ends abruptly without inserting the remaining rows(i.e. from 100th row to 1000th row). How to handle this kind of scenario such that even if the 100th row fails to be inserted, the process should carry on for the remaining rows(i.e. from 101th row to 1000th row) ?

The default behaviors will skip the failed and continue the remaining rows. Logs the failed insert or roll back the entire batch operation with @Transactional

Hi I removed the transactional annotation and as you said the rest of the batch was loaded. But the other next batches are not loaded. If JDBC finishes the corrupt batch, it doesn’t makes sense to not continue with the next correct batches. Is there a simple way to continue with all the batches?

Hi,
How can we get the ids of autoincremented inserts via batchupdate.
Thanks
Rahul

Читать еще:  Java thread currentthread

Hi mkyong,
Can batchupdate be used for procedure call?

THIS DOES NOT DO A BATCH UPDATE. This executes the statement for iteration.

I am looking for the equivalent of:

int count[] = <0>;
Statement st = con.createStatement();
for (String where : whereList) <
st.addBatch(delete + where);
sqlList.add(delete + where);
>
count = st.executeBatch();

Add the SQL to the batch then execute the batch.

int ct = 0;
String sql = “DELETE MY_TABLE WHERE RCD_ID = ?”;
List deleteArgsList = new ArrayList();
for (Foo f: fooList) <
deleteArgsList.add(new Object[] );
>

int[] rslts = capsJdbcTemplate.batchUpdate(sql, deleteArgsList);

Is it working on Oracle Database

Leave as is if you value it or pick from any of the displayed background textures.
Change the background to any color you’d like, of course. You might even discover a new passion for yourself or your kids.

i tried using above bit of code but when I’m running the code I’m gettin following exception;
Throwable occurred: java.sql.BatchUpdateException: Duplicate entry ‘abhi21’ for key ‘PRIMARY’

i suppose it is trying to insert the last row twice which is the reason of this exception.
can u help me to avoid it.

its bit urgent рџ™Ѓ

This is not a batch update. This executes on statement at a time.

I am looking for the equivalent of
for (Object o: objList) <
st.addBatch(sql)

Hi
i did a batch update for single table and i want to do for 6 more tables, so i created 6 methods so for every method should i internally call different set methods for prepared statements

Hi Guys, How we can handled the duplicate exception while insert data in batch.

use merge query.

Nice article….that exactly i am looking for. But i have to also write Junit test case for this.
please also provide the Junit test case for the above example using jMock.

Thank you so much.
Your examples help us on our daily work. Easy to read and understand. Literally, we do well at work and deliver good quality work EFFICIENTLY because of people like you.

Re a leboga (Thank you)

I tried to use batch Update in my application and we used BatchPreparedStatement and HashMap for passing the values. It’s not throwing any exception instead the status int array values are -2, For testing purpose we are inserting only one row. it’s not inserting data into table.

I tried to inserting same data using same query but row by row, instead batch update, we used update, then its working fine and returning status as 1.

i con’t figure out the issue, could please suggest me.

Собеседование по Java EE — SQL, JDBC (вопросы и ответы). Часть 2

Вторая часть Вопросов и ответов для собеседования о применении SQL, JDBC в Java приложениях.

к списку вопросов раздела JEE

Вопросы

31. Расскажите про Apache DBCP API.
32. Какие вы знаете уровни изоляции соединений в JDBC?
33. Что вы знаете о JDBC RowSet? Какие существуют различные типы RowSet?
34. В чем разница между ResultSet и RowSet?
35. Приведите пример наиболее распространенных исключений в JDBC.
36. Расскажите о типах данных CLOB и BLOB в JDBC.
37. Что вы знаете о «грязном чтении» (dirty read) в JDBC? Какой уровень изоляции предотвращает этот тип чтения?
38. Какие есть две фазы commit?
39. Приведите пример различных типов блокировки в JDBC.
40. Как вы понимаете DDL и DML выражения?
41. Какая разница между java.util.Date и java.sql.Date?
42. Как вставить изображение или необработанные данные в базу данных?
43. Что вы можете рассказать о фантомном чтении? Какой уровень изоляции его предотвращает?
44. Что такое SQL Warning? Как возвратить SQL предупреждения в JDBC программе?
45. Как запустить Oracle Stored Procedure с объектами базы данных IN/OUT?
46. Приведите пример возникновения java.sql.SQLException: No suitable driver found.
47. Best Practices в JDBC.

Ответы

31. Расскажите про Apache DBCP API.

При использование DataSource для получения соединения с базой данных возникает проблема тесной связи кода с драйвером реализации DataSource. Кроме того, большинство из кода является шаблонно повторяющимся (т.н. boilerplate code), за исключением выбора класса реализации источника данных.

Apache DBCP API помогает нам избавиться от этих проблем, предоставляя реализацию DataSource, который работает в качестве уровня абстракции между нашей программой и различными драйверами JDBC. Библиотека Apache DBCP API основана на библиотеке Commons Pool library, поэтому необходимо удостовериться, что все необходимые зависимости правильно подключены к проекту.

32. Какие вы знаете уровни изоляции соединений в JDBC?

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

Когда мы используем транзакции в JDBC для обеспечения целостности данных, СУБД использует блокировки, чтобы заблокировать доступ других обращений к данным, участвующим в транзакции. Такие блокировки необходимы, чтобы предотвратить грязное чтение (Dirty Read), неповторяющиеся чтение (Non-Repeatable Read) и фантомное чтение (Phantom-Read).
Уровень изоляции транзакции JDBC используемый СУБД для механизма блокировки можно задать с помощью метода setTransactionIsolation() . Получить информацию о применяемом уровне изоляции поможет метод Connection getTransactionIsolation() .

33. Что вы знаете о JDBC RowSet? Какие существуют различные типы RowSet?

JDBC RowSet содержит табличные данные в более гибком формате по сравнению с ResultSet. Все объекты RowSet являются производными из ResultSet, так что они имеют все возможности ResultSet с некоторыми дополнительными функциями. RowSet интерфейс определяется в javax.sql пакета. Можно выделить следующие дополнительные функции, предоставляемые RowSet:

  • Функции похожие на Java Beans со свойствами и getset методами для работы с ними. RowSet использует модель событий JavaBeans. В результате можно посылать уведомления любого зарегистрированного компонента для таких событий, например, движение курсора, обновления / вставка / удаление из строки и изменять содержимое RowSet.
  • Объекты RowSet поддерживают скроллинг по данным (scrollable), а так же являются обновляемыми по умолчанию. Так что если СУБД не поддерживает скроллинг или обновляемый ResultSet, мы можем использовать RowSet, чтобы получить эти функции.

RowSet можно разделить на два типа:

  1. Connected RowSet Objects – эти объекты подключаются к БД и очень похожи на объекты ResultSet. JDBC API предоставляет только одно подключение объекта RowSet — javax.sql.rowset.JdbcRowSet и это является стандартной реализации класса com.sun.rowset.JdbcRowSetImpl .
  2. Disconnected RowSet Objects – эти объекты RowSet не требуют подключения к базе данных. Они более легковесные и могут быть сериализованы. Такие объекты хорошо подходят для передачи данных по сети. Существуют четыре реализации такого типа объектов (disconnected RowSet objects).
Читать еще:  Как запустить java игры на пк

Кратко рассмотрим четыре реализации Disconnected RowSet Objects:

  • CachedRowSet — объекты могут получить соединение и выполнить запрос, считать данные ResultSet для заполнения данных RowSet. Мы можем управлять и обновлять данные на время отключения от БД и записать измененные данные при очередном подключении.
  • WebRowSet получены из CachedRowSet — такие объекты могут читать и записывать XML документы.
  • JoinRowSet получены из WebRowSet — могут образовывать SQL JOIN без подключения к источнику данных.
  • FilteredRowSet получены из WebRowSet — поддержка применения критериев фильтрации, поэтому видны только выбранные (полученные) данные.

34. В чем разница между ResultSet и RowSet?

Объекты RowSet являются производными из ResultSet, так что они имеют все возможности ResultSet с некоторыми дополнительными функциями. Одним из существенных преимуществ является возможность работы с данными без соединения с базой, а так же их легковесность и возможности пересылки данных объектов по сети.

Следует ли использовать ResultSet или RowSet зависит от ваших требований. ResultSet, возможно, подойдет к длительным подключениям, в то время как RowSet будет лучшим выбором для подключений к базам данных с возможностью дисконекта и обработки полученных данных.

35. Приведите пример наиболее распространенных исключений в JDBC.

Некоторые из наиболее распространенных исключений JDBC:

  • java.sql.SQLException — это базовый класс для исключений JDBC.
  • java.sql.BatchUpdateException — возникает при исключительных ситуациях пакетной обработки запросов. Может зависеть от типа драйвера JDBC, который может выбросить взамен базовый SQLException.
  • java.sql.SQLWarning — для предупреждающих сообщений различных SQL операций.
  • java.sql.DataTruncation — когда значения данных неожиданно усекаются по причинам, не зависящим от превышения MaxFieldSize.

36. Расскажите о типах данных CLOB и BLOB в JDBC.

Character Large OBjects (CLOBs) — тип данных (внутренний символьный объект), используемый для хранения больших объектов. При выборе значения любого LOB-типа посредством оператора SELECT возвращается указатель, а не само значение; кроме того, типы LOB могут быть и внешними. Этот тип данных является подходящим для хранения текстовой информации, которая может выходить за пределы обычного типа данных VARCHAR (верхний предел 32 Кбайт).
Внутренний большой двоичный объект (BLOB) — двоичный объект большого размера, который может содержать переменное количество данных. Этот тип данных может хранить данные объемом более VARBINARY (32K предел). Тип данных, предназначенный, в первую очередь, для хранения изображений, аудио и видео, а также компилированного программного кода.

37. Что вы знаете о «грязном чтении» (dirty read) в JDBC? Какой уровень изоляции предотвращает этот тип чтения?

«Грязное» чтение (англ. dirty read) — чтение данных, добавленных или изменённых транзакцией, которая впоследствии не подтвердится (откатится). Получение недействительного в последствии значения (после отката транзакции) может приводить к непредвиденным результатам.

Dirty Read можно предотвратить, используя следующие уровни изоляции: TRANSACTION_READ_COMMITTED , TRANSACTION_REPEATABLE_READ и TRANSACTION_SERIALIZABLE .

38. Какие есть две фазы commit?

Когда мы работаем в распределенных системах, где участвуют несколько баз данных, мы должны использовать протокол с 2 фазами фиксации. 2 фазовый протокол фиксации является атомарным протоколом для распределенных систем. На первом этапе, менеджер транзакций передает commit-request всем ресурсам транзакции. Если все ресурсы транзакции ответили ОК, то менеджер транзакций фиксирует изменения транзакций для всех ресурсов. Если какой-либо из ресурсов транзакций уведомляет об отмене, то менеджер транзакций может откатить все изменения транзакций.

39. Приведите пример различных типов блокировки в JDBC.

На более широком уровне есть два типа механизма блокировки для предотвращения повреждения данных из-за одновременной работы с данными несколькими пользователями. По логике реализации различают два вида блокировок.

Оптимистическая блокировка — не ограничивает модификацию обрабатываемых данных сторонними сессиями, однако перед началом предполагаемой модификации запрашивает значение некоторого выделенного атрибута каждой из строк данных (обычно используется наименование VERSION и целочисленный тип с инициальным значением 0). Перед записью модификаций в базу данных перепроверяется значение выделенного атрибута, и если оно изменилось, то транзакция откатывается или применяются различные схемы разрешения коллизий. Если значение выделенного атрибута не изменилось — производится фиксация модификаций с одновременным изменением значения выделенного атрибута (например, инкрементом) для сигнализации другим сессиям о том, что данные изменились.
Пессимистическая блокировка — накладывается перед предполагаемой модификацией данных на все строки, которые такая модификация предположительно затрагивает. Всё время действия такой блокировки исключена модификация данных из сторонних сессий, данные из блокированных строк доступны согласно уровню изолированности транзакции. По завершению предполагаемой модификации гарантируется непротиворечивая запись результатов.

40. Как вы понимаете DDL и DML выражения?

Data Definition Language (DDL) (язык описания данных) — это семейство компьютерных языков, используемых в компьютерных программах для описания структуры баз данных. Функции языков DDL определяются первым словом в предложении (часто называемом запросом), которое почти всегда является глаголом. В случае с SQL это глаголы — «create» («создать»), «alter» («изменить»), «drop» («удалить»).

Data Manipulation Language (DML) (язык управления (манипулирования) данными) — это семейство компьютерных языков, используемых в компьютерных программах или пользователями баз данных для получения, вставки, удаления или изменения данных в базах данных. Функции языков DML определяются первым словом в предложении (часто называемом запросом), которое почти всегда является глаголом. В случае с SQL эти глаголы — «select» («выбрать»), «insert» («вставить»), «update» («обновить»), и «delete» («удалить»). Это превращает природу языка в ряд обязательных утверждений (команд) к базе данных.

41. Какая разница между java.util.Date и java.sql.Date?

java.util.Date содержит информацию о дате и времени, тогда как java.sql.Date содержит информацию только о дате, но не имеет информации о времени. Если необходимо сохранить информацию о времени в базе данных, то желательно использовать поля Timestamp или DateTime.
Java.util.Date — основной универсальный объект. В нем просто сохраняется дата (как long).

java.sql.Date расширяет java.util.Date и добавляет следующую функциональность:

1) toString выводит дату в качестве «yyyy-mm-dd», а не как у конкретного языкового стандарта строки (локали).

2) Добавлен метод valueOf для чтения строк формата «yyyy-mm-dd» и дальнейшего разбора ее в объект sql.Date.

42. Как вставить изображение или необработанные данные в базу данных?

Для этого можно использовать тип данных BLOB, чтобы вставить картинку или двоичные данные в базу данных.

43. Что вы можете рассказать о фантомном чтении? Какой уровень изоляции его предотвращает?

Ситуация, когда при повторном чтении в рамках одной транзакции одна и та же выборка дает разные множества строк. Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector