You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Spanner客户端run_in_transaction报错‘Transaction is not begun’如何修复?

问题原因与修复方案

你遇到的问题核心是:DDL语句(如CREATE TABLE)不能通过run_in_transaction执行。run_in_transaction设计用于处理普通的读写事务,而Spanner要求DDL操作必须通过专门的DDL更新接口执行,这类操作不属于常规读写事务范畴,所以会抛出"Transaction is not begun"错误。

修复后的代码

from google.cloud import spanner
from google.api_core.exceptions import GoogleAPICallError

# 初始化Spanner客户端与资源
spanner_client = spanner.Client()
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

# 执行DDL建表操作
try:
    # 直接传入DDL语句列表给update_ddl方法
    database.update_ddl(
        [
            'CREATE TABLE test_table (id INT64, data STRING(MAX)) PRIMARY KEY (id)'
        ]
    )
    print("表创建成功")
except GoogleAPICallError as ex:
    print(ex)
except ValueError as ex:
    print(ex)

关键说明

  • update_ddl是Spanner专门用于执行数据库结构变更的方法,它会自动处理DDL操作所需的事务逻辑,不需要手动管理事务。
  • 如果你需要执行多条DDL语句,可以把它们放在同一个列表中传入,Spanner会保证这些操作的原子性(要么全部成功,要么全部回滚)。
  • 原代码中的run_in_transaction仅适用于SELECT、INSERT、UPDATE、DELETE这类读写操作,不能用于DDL。

内容的提问来源于stack exchange,提问作者Kazuma Kusu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:14:55