Зачем нужны транзакции при работе с базой данных в Android?

Картинка с сайта freepik.com

Как нам говорит Wikipedia:

Транза́кция (англ. transaction, от лат. transactio — соглашение, договор) — минимальная логически осмысленная операция, которая имеет смысл и может быть совершена только полностью.

Исходя из этого определения следует, что при обращении к чему-либо через транзакцию, при возникновении ошибки, потеря данных исключена.

Поясним это красочно на примере.

Многие из читающих знают или представляют себе, что такое транзакция в случае перевода денег. Какие проблемы могут возникнуть без транзакции?

Вы оплачиваете покупку нового телевизора через интернет банк. Нет никаких транзакций. Вы заполняете данные, поля, нажимаете кнопку отправить. В этот момент ваши деньги снимаются со счёта и уходят в сторону интернет-магазина. Но по несчастливой случайности из-за некоторой ошибки деньги не доходят. То есть они ушли в “никуда”. Требовать возврата денег не у кого, так же как и требовать телевизор у продавца, ведь денег он так и не получил.

Именно для таких случаев была придумана защита — транзакция.

В Android при работе с базой данных также рекомендуется использовать транзакции при манипулировании данными.

Есть три ключевых действия, которые мы должны совершить при проведении транзакции в Android:

  1. Начать транзакцию -database.beginTransaction()-
  2. При успешном завершении указать, что транзакция завершилась успешно -database.setTransactionSuccessful()- и завершить транзакцию -database.endTransaction()-
  3. При некорректном событии в транзакции (ошибке) завершить транзакцию -database.endTransaction()-

Остаётся открытым вопрос: “Как именно обрабатывать ошибки?”. Ответ прост — с помощью try-catch-finally.

Вот небольшой отрывок кода, для примера:

{
SomeDbHelper dbHelper = new SomeDbHelper(context);
SQLiteDatabase database = dbHelper.getWritableDatabase();

database.beginTransaction();

try {
ContentValues someContentValues = new ContentValues();
someContentValues.put("name", someNameString);

database.insert("Table", null, someContentValues);

database.setTransactionSuccessful();
database.endTransaction();

dbHelper.close();
}
catch (SQLiteException exception)
{
exception.printStackTrace();

database.endTransaction();
dbHelper.close();}
}

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

Надеюсь, что кому-нибудь это будет полезно.

Всех благ.

Блог автора: http://junior-freelancer.weebly.com/