Middle+
Kas nutiks, jei ištrinsite skaitytoją, kuris turi knygą? Kaip apsaugoti duomenų vientisumą?
sobes.tech AI
Atsakymas iš AI
Jei ištrinsite skaitytoją, kuris turi išduotą knygą, gali atsirasti neatitikimas duomenų bazėje arba duomenų struktūroje: knyga yra pažymėta kaip išduota, tačiau skaitytojas jau neegzistuoja. Tai sukelia informacijos praradimą apie tai, kas paėmė knygą, ir pažeidžia duomenų vientisumą.
Siekiant apsaugoti duomenų vientisumą, galima naudoti šiuos požiūrius:
- Apribojimai duomenų bazės lygyje: sukonfigūruoti išoriniai raktai su
ON DELETE RESTRICTarbaON DELETE CASCADEapribojimais. Pavyzdžiui, uždrausti ištrinti skaitytoją, jei jis turi išduotų knygų. - Transakcijos: trinant skaitytoją, patikrinti ir atnaujinti susijusius įrašus (pavyzdžiui, grąžinti knygas arba perkelti jas kitam skaitytojui) vienoje transakcijoje.
- Programos logika: prieš trinant, patikrinti, ar skaitytojas neturi aktyvių išdavimų, ir jei turi, uždrausti trinimą arba valdyti išdavimus.
Pavyzdys Go kalba naudojant transakciją ir patikrinimą:
func DeleteReader(db *sql.DB, readerID int) error {
tx, err := db.Begin()
if err != nil {
return err
}
defer tx.Rollback()
var count int
err = tx.QueryRow("SELECT COUNT(*) FROM books WHERE reader_id = ?", readerID).Scan(&count)
if err != nil {
return err
}
if count > 0 {
return fmt.Errorf("neįmanoma ištrinti skaitytojo, turinčio išduotų knygų")
}
_, err = tx.Exec("DELETE FROM readers WHERE id = ?", readerID)
if err != nil {
return err
}
return tx.Commit()
}