使用局部事务(分区键事务)可以指定某个分区键下的操作是原子的,该分区键下的操作要么全部成功要么全部失败,并且所提供的隔离级别为串行化。

使用局部事务只需要使用OTSClient#start_local_transaction在指定的分区键下启动事务即可,其返回值即为事务ID,后续事务操作可以通过事务ID来执行。当前支持局部事务的操作如下:
  • DeleteRow
  • UpdateRow
  • BatchWriteRow
  • GetRange
  • PutRow
  • GetRow

构建Client

示例代码如下:
client = OTSClient(
     OTS_ENDPOINT,             # endpoint
     OTS_ACCESS_KEY_ID,        # access_key_id 
     OTS_ACCESS_KEY_SECRET,    # access_key_secret
     OTS_INSTANCE)             # 实例名

事务的启动、提交与中止

  • 启动事务
    您可以通过OTSClient#start_local_transaction来启动事务。
    # 在PK0下启动事务
    key = [('PK0', 1)]
    # start_local_transaction方法的返回值即为transaction_id
    transaction_id = client.start_local_transaction(table_name, key)
  • 提交事务
    # 提交事务
    client.commit_transaction(transaction_id)
  • 中止事务
    client.abort_transaction(transaction_id)

通过事务ID执行操作

  • 通过事务执行写入操作
    以下为PutRow操作示例。在事务中的写操作必须要在启动事务的分区键下执行,否则会抛出异常。
    primary_key = [('PK0', 1), ('PK1', 'transaction')]
    attribute_columns = [('value', 'origion value')]
    row = Row(primary_key, attribute_columns)
    condition = Condition(RowExistenceExpectation.IGNORE)
    consumed, return_row = client.put_row(table_name, row, condition)
  • 通过事务执行读取操作
    您可以在事务中执行一些读操作,例如最基本的“读取-修改-写回”,以下为GetRow操作示例。在事务下的GetRow操作必须在启动事务的分区键下执行。
    primary_key = [('PK0', 1), ('PK1', 'transaction')]
    columns_to_get = ['value']
    
    consumed, return_row, next_token = client.get_row(
        table_name, primary_key, columns_to_get, None, 1, None, None, None, None, transaction_id
    )
    
    for att in return_row.attribute_columns:
        print ('\tname:%s\tvalue:%s' % (att[0], att[1]))