optimistic_transaction.h 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. #pragma once
  6. #include <stack>
  7. #include <string>
  8. #include <unordered_map>
  9. #include <vector>
  10. #include "db/write_callback.h"
  11. #include "rocksdb/db.h"
  12. #include "rocksdb/slice.h"
  13. #include "rocksdb/snapshot.h"
  14. #include "rocksdb/status.h"
  15. #include "rocksdb/types.h"
  16. #include "rocksdb/utilities/optimistic_transaction_db.h"
  17. #include "rocksdb/utilities/transaction.h"
  18. #include "rocksdb/utilities/write_batch_with_index.h"
  19. #include "utilities/transactions/transaction_base.h"
  20. #include "utilities/transactions/transaction_util.h"
  21. namespace ROCKSDB_NAMESPACE {
  22. class OptimisticTransaction : public TransactionBaseImpl {
  23. public:
  24. OptimisticTransaction(OptimisticTransactionDB* db,
  25. const WriteOptions& write_options,
  26. const OptimisticTransactionOptions& txn_options);
  27. // No copying allowed
  28. OptimisticTransaction(const OptimisticTransaction&) = delete;
  29. void operator=(const OptimisticTransaction&) = delete;
  30. virtual ~OptimisticTransaction();
  31. void Reinitialize(OptimisticTransactionDB* txn_db,
  32. const WriteOptions& write_options,
  33. const OptimisticTransactionOptions& txn_options);
  34. Status Prepare() override;
  35. Status Commit() override;
  36. Status Rollback() override;
  37. Status SetName(const TransactionName& name) override;
  38. protected:
  39. Status TryLock(ColumnFamilyHandle* column_family, const Slice& key,
  40. bool read_only, bool exclusive, const bool do_validate = true,
  41. const bool assume_tracked = false) override;
  42. private:
  43. ROCKSDB_FIELD_UNUSED OptimisticTransactionDB* const txn_db_;
  44. friend class OptimisticTransactionCallback;
  45. void Initialize(const OptimisticTransactionOptions& txn_options);
  46. // Returns OK if it is safe to commit this transaction. Returns Status::Busy
  47. // if there are read or write conflicts that would prevent us from committing
  48. // OR if we can not determine whether there would be any such conflicts.
  49. //
  50. // Should only be called on writer thread.
  51. Status CheckTransactionForConflicts(DB* db);
  52. void Clear() override;
  53. void UnlockGetForUpdate(ColumnFamilyHandle* /* unused */,
  54. const Slice& /* unused */) override {
  55. // Nothing to unlock.
  56. }
  57. Status CommitWithSerialValidate();
  58. Status CommitWithParallelValidate();
  59. };
  60. // Used at commit time to trigger transaction validation
  61. class OptimisticTransactionCallback : public WriteCallback {
  62. public:
  63. explicit OptimisticTransactionCallback(OptimisticTransaction* txn)
  64. : txn_(txn) {}
  65. Status Callback(DB* db) override {
  66. return txn_->CheckTransactionForConflicts(db);
  67. }
  68. bool AllowWriteBatching() override { return false; }
  69. private:
  70. OptimisticTransaction* txn_;
  71. };
  72. } // namespace ROCKSDB_NAMESPACE