optimistic_transaction.h 3.0 KB

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