【 使用环境 】 测试环境(生产也是有此问题)
【 OB or 其他组件 】ob
【 使用版本 】企业版3.2.4
【问题描述】 pymysql链接mysql的时候cursor.execute(执行完这句,没有commit的时候,数据不会入库,但是ob就直接入库了,然后正常是如果cursor.execute有问题,需要执行回滚语句的,cursor.execute直接提交了的话都没法回滚了。必须每次在cursor这个会话前执行一下SET autocommit = 0。
pymysql用法:
import pymysql
db_config = {
“host”: “1xxx”, # MySQL 主机地址
“port”: xxx, # MySQL 端口号
“user”: “xxx”, # MySQL 用户名
“password”: “xx”, # MySQL 密码
“database”: “xxx”, # 数据库名称
# “autocommit”: False
}
connection = pymysql.connect(**db_config)
cursor = connection.cursor()
cursor.execute(“INSERT INTO szyg_portal
.t_logs_202412
(id
, active
, create_time
, create_user_id
, ip
, action
, resource
, desc
) VALUES (299999, 1, ‘2024-12-01 00:02:02’, -1, ‘’, ‘1’, ‘15’, ‘1’);”) # 插入多条数据
cursor.close()
connection.close()
因为这个原因导致python一堆框架的 orm库都不能执行回滚操作了
框架用法如下
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class User(Base):
tablename = ‘users’
id = Column(Integer, primary_key=True)
name = Column(String)
创建数据库引擎和会话
engine = create_engine(‘mysql+pymysql://root:mysql@192.168.0.17:12881/test’)
Session = sessionmaker(bind=engine)
session = Session()
session.execute(“SET autocommit = 0”) # 必须设置,否则session.flush()没有作用,框架中执行完flash能得到插入数据的id, 不设置则只能执行commit操作,就无法回滚了
try:
# 添加一个新用户
new_user = User(name=‘11111’)
session.add(new_user)
session.flush()
session.commit()
except Exception as e:
# 发生异常时回滚事务
session.rollback()
print(f"An error occurred: {e}")
finally:
# 关闭会话
session.close()
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):
【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!