| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | // Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.//  This source code is licensed under both the GPLv2 (found in the//  COPYING file in the root directory) and Apache 2.0 License//  (found in the LICENSE.Apache file in the root directory).#pragma once#ifndef ROCKSDB_LITE#include <stack>#include <string>#include <unordered_map>#include <vector>#include "db/write_callback.h"#include "rocksdb/db.h"#include "rocksdb/slice.h"#include "rocksdb/snapshot.h"#include "rocksdb/status.h"#include "rocksdb/types.h"#include "rocksdb/utilities/transaction.h"#include "rocksdb/utilities/optimistic_transaction_db.h"#include "rocksdb/utilities/write_batch_with_index.h"#include "utilities/transactions/transaction_base.h"#include "utilities/transactions/transaction_util.h"namespace ROCKSDB_NAMESPACE {class OptimisticTransaction : public TransactionBaseImpl { public:  OptimisticTransaction(OptimisticTransactionDB* db,                        const WriteOptions& write_options,                        const OptimisticTransactionOptions& txn_options);  // No copying allowed  OptimisticTransaction(const OptimisticTransaction&) = delete;  void operator=(const OptimisticTransaction&) = delete;  virtual ~OptimisticTransaction();  void Reinitialize(OptimisticTransactionDB* txn_db,                    const WriteOptions& write_options,                    const OptimisticTransactionOptions& txn_options);  Status Prepare() override;  Status Commit() override;  Status Rollback() override;  Status SetName(const TransactionName& name) override; protected:  Status TryLock(ColumnFamilyHandle* column_family, const Slice& key,                 bool read_only, bool exclusive, const bool do_validate = true,                 const bool assume_tracked = false) override; private:  ROCKSDB_FIELD_UNUSED OptimisticTransactionDB* const txn_db_;  friend class OptimisticTransactionCallback;  void Initialize(const OptimisticTransactionOptions& txn_options);  // Returns OK if it is safe to commit this transaction.  Returns Status::Busy  // if there are read or write conflicts that would prevent us from committing  // OR if we can not determine whether there would be any such conflicts.  //  // Should only be called on writer thread.  Status CheckTransactionForConflicts(DB* db);  void Clear() override;  void UnlockGetForUpdate(ColumnFamilyHandle* /* unused */,                          const Slice& /* unused */) override {    // Nothing to unlock.  }  Status CommitWithSerialValidate();  Status CommitWithParallelValidate();};// Used at commit time to trigger transaction validationclass OptimisticTransactionCallback : public WriteCallback { public:  explicit OptimisticTransactionCallback(OptimisticTransaction* txn)      : txn_(txn) {}  Status Callback(DB* db) override {    return txn_->CheckTransactionForConflicts(db);  }  bool AllowWriteBatching() override { return false; } private:  OptimisticTransaction* txn_;};}  // namespace ROCKSDB_NAMESPACE#endif  // ROCKSDB_LITE
 |