Примечание. Этот вопрос фокусируется на веб -приложениях, использующих транзакции 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
Отказаться от коммита? ⇐ MySql
Форум по Mysql
1745531324
Anonymous
Примечание. Этот вопрос фокусируется на веб -приложениях, использующих транзакции 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(...)
Подробнее здесь: [url]https://stackoverflow.com/questions/79591487/roll-back-a-commit[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия