Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL AUTO_INCREMENT nie wycofuje się

To nie może działać w ten sposób. Rozważ:

  • program pierwszy, otwierasz transakcję i wstawiasz do tabeli FOO, która ma klucz podstawowy autoinc (arbitralnie mówimy, że otrzymuje 557 dla swojej wartości klucza).
  • Rozpoczyna się program drugi, otwiera transakcję i wstawia do tabeli FOO otrzymując 558.
  • Zaprogramuj dwa wstawienia do tabeli BAR, która ma kolumnę będącą kluczem obcym dla FOO. Więc teraz 558 znajduje się zarówno w FOO, jak i BAR.
  • Program drugi teraz zatwierdza.
  • Program trzeci uruchamia się i generuje raport z tabeli FOO. Rekord 558 jest drukowany.
  • Po tym program cofa się.

W jaki sposób baza danych odzyskuje wartość 557? Czy przechodzi do FOO i dekrementuje wszystkie inne klucze podstawowe większe niż 557? Jak to naprawia BAR? Jak usuwa 558 wydrukowany na wyjściu programu raportu trzy?

Numery sekwencyjne Oracle są również niezależne od transakcji z tego samego powodu.

Jeśli możesz rozwiązać ten problem w stałym czasie, jestem pewien, że możesz zarobić dużo pieniędzy w dziedzinie bazy danych.

Teraz, jeśli masz wymóg, aby pole automatycznego przyrostu nigdy nie zawierało przerw (na przykład do celów audytu). Wtedy nie możesz wycofać swoich transakcji. Zamiast tego musisz mieć flagę statusu w swoich rekordach. Przy pierwszym wstawieniu status rekordu to „Niekompletny”, następnie rozpoczynasz transakcję, wykonujesz swoją pracę i aktualizujesz status na „Konkuruj” (lub cokolwiek potrzebujesz). Następnie, kiedy dokonasz zatwierdzenia, zapis jest na żywo. Jeśli transakcja zostanie wycofana, niekompletny rekord jest nadal dostępny do kontroli. Spowoduje to wiele innych problemów, ale jest jednym ze sposobów radzenia sobie ze śladami audytu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UTF-8 przez całą drogę

  2. Błąd mySQL 1040:Za dużo połączeń

  3. Połącz Javę z bazą danych MySQL

  4. Jak dodać domyślne ograniczenie w MySQL?

  5. Jak skonfigurować replikację asynchroniczną z klastra Galera na samodzielny serwer MySQL z GTID