4.1 Транзаксияҳо ва ҳамҷоягии базаи маълумот
Ҳолати оддии кори базаи маълумот – ин вақте ки ба он ҳар дақиқа ҳазорҳо дархост аз садҳо мизоҷи гуногун меояд. Дар ин ҳолат аксар вақт вазъиятҳое рӯй медиҳанд, ки ба якчанд маълумот аз дархостҳои гуногун муроҷиат мекунанд.
Бармегарданд, вале ҳолатҳое ҳам мешаванд, ки як дархост кадом хатро мехонад, аммо дархости дигар дар ин вақт онро тағйир медиҳад. Тасаввур кунед, ки чӣ мешавад, агар касе хатро хонда бошад, ки танҳо нисфаш тағйир ёфтааст? Ҳеҷ чизи хуб.
Ин мушкилотро бо чанд роҳ ҳал мекунанд. Аввалан, метавон танҳо хатро, ки тағйир меёбад, қулф кардан. Барои хониш ё барои сабт. Ин роҳ кор мекунад, вале суръати база хеле осеб мебинад.
Роҳи дуввум ин аст, ки хатро танҳо барои сабт қулф мекунанд. Дар ин ҳолат ҳам ҳолат хоҳад буд, ки касе кӯшиш мекунад хатро, ки қисман тағйир ёфтааст, хонад. Баромад – набояд ҳолате бошад, ки хат қисман тағйир ёфтааст.
Пас сеюм роҳро – транзаксияҳо фикр карданд. Транзаксия – ин як гурӯҳ амалҳоест, ки ё ҳама якҷоя иҷро мешаванд ё ягонто. Наметавонад ҳолате бошад, ки қисме аз амалҳо иҷро шуда, вале қисми дигар – не. Агар натавонад ҳама тағйиротро ворид кунад, пас ҳама тағйироти воридшуда ба ақиб мегузарад.
Ҳар сервери замонавии SQL имконият медиҳад, ки маълумот танҳо дар транзаксияҳо тағйир дода шавад. Шумо транзаксия мекушоед, ҳар гуна тағйиротро дар шумораи дилхоҳи ҷадвалҳо ворид мекунед ва пас транзаксияро commit мекунед. Баъдан сервери SQL кӯшиш мекунад тағйиротро ворид кунад. Агар ҳама чизи хуб бошад, пас ба базаи умумии маълумот илова мешавад. Агар мушкилие бошад, пас ҳама тағйирот бекор карда мешавад.
Hibernate ҳам ин парадигмаро истифода мекунад. Маҳз аз ин сабаб дар лексияи гузашта дидем, ки дар кӯшиши ҳифзи объект Employee дар база аввал транзаксия мекушоед ва пас аз ҳифз – commit мешуд.
Мо ин мавзӯъро боз тафсиликона меомӯзем, ва ҳоло танҳо донед, ки чаро транзаксияҳо лозиманд ва онҳо одатан дар куҷо истифода мешаванд.
4.2 Гирфтани объектҳо
Агар Hibernate дархост барои гирфтани маълумот иҷро кунад, пас кушодани транзаксия ошкоро лозим нест. Hibernate худаш ин корро мекунад, агар зарур ҳисоб кунад: ӯ танзимоти худ ва ҳамчунин танзимоти сервери SQL дорад.
Мо бо ту роҳҳои кор бо базаи маълумотро меомӯзем. Ва соддатарини онҳо – ин гирфтани объект аз рӯи ID. Барои ин бояд усули get()
аз объекти session истифода бурда шавад. Намуди умумии чунин дархост:
Класс ном = session.get(Класс.class, ID);
Мисол:
public User getUserById(Integer id) {
try (Session session = sessionFactory.openSession()) {
User user = session.get(User.class, id);
return user;
}
}
4.3 Ҳифзи (илова кардани) объектҳо
Агар шумо хоҳед, ки объекти худро дар базаи маълумот ҳифз кунед, дар сатҳи SQL дархост INSERT иҷро мешавад. Аз ин рӯ, амалҳои шуморо лозим аст, ки дар шакли транзаксияи алоҳида иҷро шавад. Илова бар ин, барои ҳифз кардани беҳтар аст, ки усули persist()
аз объекти session истифода шавад.
Намуди умумии чунин дархост:
session.persist(Объект);
Усули persist()
на танҳо базаро, балки худаш объектро ҳам тағйир медиҳад. Ҳама кор дар он аст, ки вақте мо объектро ба база илова мекунем, пас аз илова ба ин объект ID надорад. Хуб, одатан ин тавр аст, гарчанде ки баъзе номуайяние мешавад. Ва пас аз илова ба объект ID аллакай дорад.
public boolean saveUser(User user) {
try (Session session = sessionFactory.openSession()) {
Transaction transaction = session.beginTransaction();
session.persist(user);
transaction.commit();
return true;
}
catch() {
return false;
}
}
Ҳамчунин дар объекти Session усули save()
ҳаст, ки функсияи аналогӣ иҷро мекунад. Фақат усули save()
– ин стандарти кӯҳнаи Hibernate аст, ва усули persist()
– ин JPA-стандарт.
4.4 Нобуд кардани объектҳо
Агар хоҳед, ки объекти мавҷударо нобуд кунед, ин хеле осон аст. Барои ин дар объекти session усули махсус – remove()
ҳаст.
Намуди умумии чунин дархост:
session.remove(Объект);
Ва, албатта, коди мисоли менависем:
public boolean removeUser(User user) {
try (Session session = sessionFactory.openSession()) {
Transaction transaction = session.beginTransaction();
session.remove(user);
transaction.commit();
return true;
}
catch() {
return false;
}
}
Чаро ин қадар душвор, ту пурсон мешавӣ?
Хуб, аввалан, ҳар гуна тағйиротҳо дар базаи маълумот ҳамеша бо худ таъсирҳои гуногуни ва на ҳамеша ошкоро ояндагӣ доранд. Ва дуввум, дар ин объект шояд бо он объектиҳои фарзандӣ ва ғайр бошад. Ҳамин тавр, сценарияҳои нобудсозӣ аксар вақт на ғалатанд.
GO TO FULL VERSION