Operacje Codeigniter
Korzystam z transakcji Codeigniter
$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
To działa świetnie, problem polega na tym, że wewnątrz
trans_starti
trans_completewywołuję inne funkcje, które zajmują się bazą danych, więc zawierają wstawki i aktualizacje, a niektóre usuń ... np .:
$this->db->trans_start();
$this->utils->insert_function($data);
$this->utils->update_function2($test);
$this->db->trans_complete();
Teraz, jeśli te funkcje są uruchomione i wystąpią błędy, CodeIgniter nie wycofa się.
Jak najlepiej poradzić sobie z takim problemem?
Jedynym rozwiązaniem, które mam na myśli, jest zwrócenie błędu z tych funkcji i wewnątrz tych funkcji dodawania (
trans_stati
trans_complete) i jeśli zwróci błąd test, do
$ this- & > db- & > trans_rollbackbyły:
$this->db->trans_start();
$result = $this->utils->insert_function($data);
if($result === false){
$this->db->trans_rollback();
}
$this->db->trans_complete();
Czy jest lepszy sposób, aby to zrobić?
Zaktualizuj 1
:
Zgodnie z żądaniem przykładowa funkcja zewnętrzna, którą wywołuję:
// insert_function contains $rec = array( 'numero' => $numero,
'transaction_id' => $id,
'debit' => $product_taxes['amount_without_taxes'],
'date' => $data['date_transaction'],
);
$this->addExerciceAccountingRecords($rec); and addExerciceAccountingRecords contains function addExerciceAccountingRecords($records) {
$this->db->insert('transactions_exercices', $records);
}
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
6 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
funkcje związane z bazą danych w
Model
zamiast w kontrolerze.
... W drugim kodzie (który nie działa) określiłeś tam model. (
). tak proste, jestem pewien, że to nie zadziała. Ponieważ nie jest to wstawianie danych z modelem równoległym i kontrolerem. Transakcja musi być zakodowana w modelu (
napiszę w modelu w mojej odpowiedzi
).
Pobierz również te materiały
Założenia
W swoim kodzie użyłeś i jako tablicy. Zakładam więc, że istnieją dwie tablice do wstawiania i aktualizowania danych.
Twoje zbiory danych
Twój kod
Nagrania
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Jeśli przejdziesz do dokumentacji CI w sekcji „Tworzenie bibliotek” pod adresem:
http://ellislab.com/codeignite ... .html
http://ellislab.com/codeignite ... .html
i spójrz na sekcję związaną z:
W głównym kontrolerze załadowałeś/utworzyłeś klasę bazy danych albo przez automatyczne ładowanie, albo przez jawne ładowanie klasy.
Następnie otwierasz transakcję, a następnie uzyskujesz dostęp
funkcje bazy danych poprzez bibliotekę narzędzi.
Jednak gdy użyjesz w swojej bibliotece, w rzeczywistości masz dostęp do innej kopii instancji bazy danych, a NIE tej powiązanej z Twoją transakcją.
Aby uzyskać dostęp do tej samej instancji, musisz użyć funkcji get_instance ().
Myślę, że to powinno rozwiązać twój problem. Twój oryginalny styl kodowania do oddzielania funkcji
dla różnych modułów jest doskonały. Musisz tylko zrozumieć ten dodatkowy szczegół.
Spróbuj i upewnij się, że przywracanie działa zgodnie z oczekiwaniami.
Elementy wewnętrzne kodu składają się z następującego kontrolera:
i prosty model do pracy z trwałością:
Zasadniczo demo próbuje zrobić dwie wstawki (po jednej w każdej z dwóch tabel).
Jeśli jedna wkładka zawiedzie, druga wycofuje się.
Zbudowałem to w CodeIgniter 2.1.3 i mogę udostępnić pliki aplikacji przez GitHub lub zip i wysłać je do Ciebie.
Anonimowy użytkownik
Potwierdzenie od:
Zaświadczenie w przypadku korzystania z MySql, użyj w formacie InnoDb
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od: