Примечание. Этот вопрос фокусируется на веб -приложениях, использующих транзакции MySQL - Commit и Offback. Несмотря на то, что приведенные ниже образцы кода используют Python, сама проблема не ограничивается выбором языка программирования, создающего веб -приложение. main.py действует как отправная точка моего приложения, и это просто запускает методы в классе mydao :
main.py
import my_dao
MyDAO.run_a()
...
MyDAO.run_b()
...
< /code>
my_dao.py определяет класс, похожий на DAO, с двумя методами, каждый из которых что-то делает с базой данных:
import mysql.connector
class MyDAO:
conn = mysql.connector.connect(...)
@classmethod
def run_a(cls):
try:
do_something_1()
cursor = cls.cursor()
cursor.execute('Query A 1')
cursor.execute('Query A 2')
do_something_2()
cursor.close()
conn.commit()
except Error as e:
conn.rollback()
log(...)
@classmethod
def run_b(cls):
try:
do_something_1()
cursor = cls.cursor()
cursor.execute('Query B 1')
# calling cls.run_a() here
cls.run_a()
cursor.execute('Query B 2')
do_something_2()
cursor.close()
conn.commit()
except Error as e:
conn.rollback()
log(...)
< /code>
As you can see, both methods have their own commit s и hollback s. run_a () в основном запускает кучу запросов, а затем совершает. run_b () аналогично, за исключением того, что он вызывает run_a () между его запросами. Однако, если run_b () не удастся после успешного запуска run_a () внутри, это вызвало бы проблему, потому что Run_a () уже совершил, и независимо от того, как Run_b () holdback s, он не будет отказываться до того, как run_b (). транзакции. Как я могу перепроектировать приведенное выше, чтобы run_b () успешно сможет откатить, включающий коммит, используемый Run_a () внутри него? независимо от класса. в общую функцию, но для меня это выглядит довольно неуклюже: < /p>
import mysql.connector
class MyDAO:
conn = mysql.connector.connect(...)
@classmethod
def _real_run_a(cls, cursor):
cursor.execute('Query A 1')
cursor.execute('Query A 2')
@classmethod
def run_a(cls):
try:
do_something_1()
cursor = cls.cursor()
cls._real_run_a(cursor)
do_something_2()
cursor.close()
conn.commit()
except Error as e:
conn.rollback()
log(...)
@classmethod
def run_b(cls):
try:
do_something_1()
cursor = cls.cursor()
cursor.execute('Query B 1')
cls._real_run_a(cursor)
cursor.execute('Query B 2')
do_something_2()
cursor.close()
conn.commit()
except Error as e:
conn.rollback()
log(...)
Подробнее здесь: https://stackoverflow.com/questions/795 ... k-a-commit
Отказаться от коммита? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение