// Copyright (c) 2015, Facebook, Inc. All rights reserved. // This source code is licensed under the BSD-style license found in the // LICENSE file in the root directory of this source tree. An additional grant // of patent rights can be found in the PATENTS file in the same directory. #pragma once #ifndef ROCKSDB_LITE #include #include #include #include #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 { class OptimisticTransactionImpl : public TransactionBaseImpl { public: OptimisticTransactionImpl(OptimisticTransactionDB* db, const WriteOptions& write_options, const OptimisticTransactionOptions& txn_options); virtual ~OptimisticTransactionImpl(); Status Commit() override; void Rollback() override; uint64_t GetNumKeys() const override; const TransactionKeyMap* GetTrackedKeys() const { return &tracked_keys_; } protected: Status TryLock(ColumnFamilyHandle* column_family, const Slice& key, bool untracked = false) override; private: OptimisticTransactionDB* const txn_db_; // Map of Column Family IDs to keys and corresponding sequence numbers. // The sequence number stored for a key will be used during commit to make // sure this key has // not changed since this sequence number. TransactionKeyMap tracked_keys_; friend class OptimisticTransactionCallback; // 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; // No copying allowed OptimisticTransactionImpl(const OptimisticTransactionImpl&); void operator=(const OptimisticTransactionImpl&); }; // Used at commit time to trigger transaction validation class OptimisticTransactionCallback : public WriteCallback { public: explicit OptimisticTransactionCallback(OptimisticTransactionImpl* txn) : txn_(txn) {} Status Callback(DB* db) override { return txn_->CheckTransactionForConflicts(db); } private: OptimisticTransactionImpl* txn_; }; } // namespace rocksdb #endif // ROCKSDB_LITE