Utilisez le SDK Tablestore pour Go pour exécuter une transaction locale au sein d'une valeur de clé de partition, afin que toutes les écritures de la transaction soient validées ou annulées ensemble. Le niveau d'isolation est Read Committed.
Prérequis
Installez le SDK Tablestore pour Go et initialisez le client. Les transactions locales nécessitent la version 1.7.8 ou ultérieure. Nous vous recommandons d'utiliser la dernière version.
Les transactions locales doivent être activées pour la table. Vous pouvez définir
EnableLocalTxnlors de la création d'une table. Pour vérifier si les transactions locales sont activées pour une table existante ou pour les activer, soumettez un ticket .
Description
Une transaction locale est limitée à une seule valeur de clé de partition. Les lectures et les écritures de la transaction partagent un ID de transaction. Le flux de travail comporte trois étapes :
Appelez
StartLocalTransactionavec une valeur de clé de partition pour créer une transaction locale et obtenir son ID de transaction.Appelez
GetRow,PutRow,UpdateRow,DeleteRow,BatchWriteRowouGetRangedans la transaction et incluez l'ID de transaction dans chaque requête.Appelez
CommitTransactionpour appliquer toutes les modifications ouAbortTransactionpour annuler la transaction et toutes les modifications.
func (client *TableStoreClient) StartLocalTransaction(request *StartLocalTransactionRequest) (*StartLocalTransactionResponse, error)
func (client *TableStoreClient) CommitTransaction(request *CommitTransactionRequest) (*CommitTransactionResponse, error)
func (client *TableStoreClient) AbortTransaction(request *AbortTransactionRequest) (*AbortTransactionResponse, error)
L'exemple suivant crée une transaction locale pour la valeur de clé de partition user-a, écrit une ligne dans la transaction et valide celle-ci.
partitionKey := &tablestore.PrimaryKey{}
partitionKey.AddPrimaryKeyColumn("user_id", "user-a")
startResponse, err := client.StartLocalTransaction(
&tablestore.StartLocalTransactionRequest{
TableName: "example_table",
PrimaryKey: partitionKey,
},
)
if err != nil {
log.Fatal(err)
}
transactionID := startResponse.TransactionId
rowKey := &tablestore.PrimaryKey{}
rowKey.AddPrimaryKeyColumn("user_id", "user-a")
rowKey.AddPrimaryKeyColumn("record_id", int64(1))
change := &tablestore.PutRowChange{
TableName: "example_table",
PrimaryKey: rowKey,
TransactionId: transactionID,
}
change.AddColumn("status", "created")
change.SetCondition(tablestore.RowExistenceExpectation_IGNORE)
_, err = client.PutRow(&tablestore.PutRowRequest{PutRowChange: change})
if err != nil {
_, _ = client.AbortTransaction(
&tablestore.AbortTransactionRequest{TransactionId: transactionID},
)
log.Fatal(err)
}
_, err = client.CommitTransaction(
&tablestore.CommitTransactionRequest{TransactionId: transactionID},
)
if err != nil {
log.Fatal(err)
}
Paramètres
Créer une transaction locale
StartLocalTransactionRequest contient les paramètres suivants.
|
Nom |
Type |
Description |
|
TableName (obligatoire) |
|
Le nom de la table. |
|
PrimaryKey (obligatoire) |
|
La valeur de clé de partition qui définit l'étendue de la transaction. Spécifiez uniquement la première colonne de clé primaire de la table. |
Opérations de données dans une transaction
PutRowChange, UpdateRowChange, DeleteRowChange, SingleRowQueryCriteria et RangeRowQueryCriteria contiennent le paramètre commun suivant lorsqu'ils sont utilisés dans une transaction.
|
Nom |
Type |
Description |
|
TransactionId (obligatoire) |
|
L'ID de transaction locale renvoyé par |
Valider ou annuler une transaction locale
CommitTransactionRequest et AbortTransactionRequest contiennent le paramètre suivant.
|
Nom |
Type |
Description |
|
TransactionId (obligatoire) |
|
L'ID de transaction locale à valider ou à annuler. |
Réponse
StartLocalTransactionResponse contient les informations métier suivantes.
|
Champ |
Type |
Description |
|
|
|
Le nouvel ID de transaction locale, utilisé dans les opérations de données ainsi que pour valider ou annuler la transaction. |
Limites
Les colonnes de clé primaire à incrémentation automatique et les transactions locales ne peuvent pas être utilisées conjointement.
Les transactions locales utilisent des verrous pessimistes pour le contrôle de la concurrence. Pendant une transaction, les écritures pour la valeur de clé de partition sont verrouillées. Seules les requêtes d'écriture portant l'ID de transaction peuvent aboutir. Le serveur libère le verrou d'écriture lorsque la transaction est validée, annulée ou expire.
Une transaction peut rester active pendant 60 secondes maximum. Si l'intervalle entre deux opérations dépasse 60 secondes, le serveur annule automatiquement la transaction.
Si une demande de création d'une transaction locale expire, il est possible que la transaction ait déjà été créée sur le serveur. Attendez l'expiration de la transaction avant d'en créer une autre.
Une transaction locale non validée peut devenir invalide. Dans ce cas, réessayez les opérations de la transaction.
Un seul ID de transaction peut être utilisé par une requête à la fois. Les requêtes concurrentes utilisant le même ID de transaction échouent.
Les requêtes d'écriture dans la transaction doivent utiliser la valeur de clé de partition employée pour créer la transaction. Les requêtes de lecture ne sont pas soumises à cette restriction.
Lorsque vous utilisez
BatchWriteRowpour écrire des lignes dans une transaction, toutes les lignes de la requête doivent appartenir à la table pour laquelle la transaction a été créée.Une transaction peut écrire jusqu'à 4 Mo de données. La quantité de données est accumulée selon les règles de calcul des requêtes d'écriture standard.
Si aucune version n'est spécifiée pour une colonne d'attribut, le serveur génère la version selon les règles des écritures standard au moment de l'écriture des données, et non lors de la validation de la transaction.
Une lecture ou une écriture ayant échoué n'invalide pas la transaction. Vous pouvez réessayer la requête ou annuler la transaction.
Exemples
Lire une ligne dans une transaction locale
L'exemple suivant lit une ligne dans une transaction locale existante. Pour une transaction en lecture seule, la validation et l'annulation ont le même effet : toutes deux libèrent la transaction.
criteria := &tablestore.SingleRowQueryCriteria{
TableName: "example_table",
PrimaryKey: rowKey,
MaxVersion: 1,
TransactionId: transactionID,
}
response, err := client.GetRow(
&tablestore.GetRowRequest{SingleRowQueryCriteria: criteria},
)
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Columns)
_, err = client.CommitTransaction(
&tablestore.CommitTransactionRequest{TransactionId: transactionID},
)
if err != nil {
log.Fatal(err)
}