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).
12 #include <unordered_map>
15 #include "db/write_callback.h"
16 #include "rocksdb/db.h"
17 #include "rocksdb/slice.h"
18 #include "rocksdb/snapshot.h"
19 #include "rocksdb/status.h"
20 #include "rocksdb/types.h"
21 #include "rocksdb/utilities/transaction.h"
22 #include "rocksdb/utilities/optimistic_transaction_db.h"
23 #include "rocksdb/utilities/write_batch_with_index.h"
24 #include "utilities/transactions/transaction_base.h"
25 #include "utilities/transactions/transaction_util.h"
29 class OptimisticTransaction
: public TransactionBaseImpl
{
31 OptimisticTransaction(OptimisticTransactionDB
* db
,
32 const WriteOptions
& write_options
,
33 const OptimisticTransactionOptions
& txn_options
);
35 virtual ~OptimisticTransaction();
37 void Reinitialize(OptimisticTransactionDB
* txn_db
,
38 const WriteOptions
& write_options
,
39 const OptimisticTransactionOptions
& txn_options
);
41 Status
Prepare() override
;
43 Status
Commit() override
;
45 Status
Rollback() override
;
47 Status
SetName(const TransactionName
& name
) override
;
50 Status
TryLock(ColumnFamilyHandle
* column_family
, const Slice
& key
,
51 bool read_only
, bool exclusive
,
52 bool untracked
= false) override
;
55 OptimisticTransactionDB
* const txn_db_
;
57 friend class OptimisticTransactionCallback
;
59 void Initialize(const OptimisticTransactionOptions
& txn_options
);
61 // Returns OK if it is safe to commit this transaction. Returns Status::Busy
62 // if there are read or write conflicts that would prevent us from committing
63 // OR if we can not determine whether there would be any such conflicts.
65 // Should only be called on writer thread.
66 Status
CheckTransactionForConflicts(DB
* db
);
68 void Clear() override
;
70 void UnlockGetForUpdate(ColumnFamilyHandle
* /* unused */,
71 const Slice
& /* unused */) override
{
76 OptimisticTransaction(const OptimisticTransaction
&);
77 void operator=(const OptimisticTransaction
&);
80 // Used at commit time to trigger transaction validation
81 class OptimisticTransactionCallback
: public WriteCallback
{
83 explicit OptimisticTransactionCallback(OptimisticTransaction
* txn
)
86 Status
Callback(DB
* db
) override
{
87 return txn_
->CheckTransactionForConflicts(db
);
90 bool AllowWriteBatching() override
{ return false; }
93 OptimisticTransaction
* txn_
;
96 } // namespace rocksdb
98 #endif // ROCKSDB_LITE