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

Как нам говорит Wikipedia:
Транза́кция (англ. transaction, от лат. transactio — соглашение, договор) — минимальная логически осмысленная операция, которая имеет смысл и может быть совершена только полностью.
Исходя из этого определения следует, что при обращении к чему-либо через транзакцию, при возникновении ошибки, потеря данных исключена.
Поясним это красочно на примере.
Многие из читающих знают или представляют себе, что такое транзакция в случае перевода денег. Какие проблемы могут возникнуть без транзакции?
Вы оплачиваете покупку нового телевизора через интернет банк. Нет никаких транзакций. Вы заполняете данные, поля, нажимаете кнопку отправить. В этот момент ваши деньги снимаются со счёта и уходят в сторону интернет-магазина. Но по несчастливой случайности из-за некоторой ошибки деньги не доходят. То есть они ушли в “никуда”. Требовать возврата денег не у кого, так же как и требовать телевизор у продавца, ведь денег он так и не получил.
Именно для таких случаев была придумана защита — транзакция.
В Android при работе с базой данных также рекомендуется использовать транзакции при манипулировании данными.
Есть три ключевых действия, которые мы должны совершить при проведении транзакции в Android:
- Начать транзакцию -database.beginTransaction()-
- При успешном завершении указать, что транзакция завершилась успешно -database.setTransactionSuccessful()- и завершить транзакцию -database.endTransaction()-
- При некорректном событии в транзакции (ошибке) завершить транзакцию -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/