Files
oceanbase/src/sql/ob_end_trans_callback.h
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

113 lines
3.7 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#ifndef __OB_SQL_END_TRANS_CALLBACK_H__
#define __OB_SQL_END_TRANS_CALLBACK_H__
#include "share/ob_define.h"
#include "lib/utility/utility.h"
#include "lib/allocator/ob_allocator.h"
#include "lib/objectpool/ob_tc_factory.h"
#include "lib/allocator/ob_mod_define.h"
#include "sql/ob_i_end_trans_callback.h"
#include "storage/tx/ob_trans_result.h"
#include "storage/tx/ob_trans_define.h"
#include "observer/mysql/ob_mysql_end_trans_cb.h"
namespace oceanbase
{
namespace sql
{
// 同一个对象可能在同一时间被多个end trans函数共享,可能会发生并发地调用同一个对象的callback函数的情况
// deprecated, only used in NullEndTransCallback and will be removed in 4.0
class ObSharedEndTransCallback : public ObIEndTransCallback
{
public:
ObSharedEndTransCallback();
virtual ~ObSharedEndTransCallback();
virtual bool is_shared() const override final { return true; }
};
// 一个对象同一时间只能被一个end trans函数独享,同一个对象只可能被串行地调用callback函数
class ObExclusiveEndTransCallback : public ObIEndTransCallback
{
public:
enum EndTransType
{
END_TRANS_TYPE_INVALID,
END_TRANS_TYPE_EXPLICIT, // 显式提交
END_TRANS_TYPE_IMPLICIT, // 隐式提交
};
public:
ObExclusiveEndTransCallback();
virtual ~ObExclusiveEndTransCallback();
virtual bool is_shared() const override final { return false; }
void set_is_need_rollback(bool is_need_rollback)
{
has_set_need_rollback_ = true;
is_need_rollback_ = is_need_rollback;
}
void set_end_trans_type(ObExclusiveEndTransCallback::EndTransType end_trans_type)
{
end_trans_type_ = end_trans_type;
}
void set_is_txs_end_trans_called(bool is_txs_end_trans_called)
{
is_txs_end_trans_called_ = is_txs_end_trans_called;
}
bool is_txs_end_trans_called() const { return is_txs_end_trans_called_; }
void reset()
{
ObIEndTransCallback::reset();
end_trans_type_ = END_TRANS_TYPE_INVALID;
has_set_need_rollback_ = false;
is_need_rollback_ = false;
is_txs_end_trans_called_ = false;
}
protected:
ObExclusiveEndTransCallback::EndTransType end_trans_type_; // 表示是显式还是隐式的commit或rollback
bool has_set_need_rollback_;
bool is_need_rollback_;
bool is_txs_end_trans_called_; // 事务模块的end trans接口是否已经调用了(正在调用过程中也算,并且调用参数不一定传的是本callback对象)
};
class ObEndTransAsyncCallback : public ObExclusiveEndTransCallback
{
public:
ObEndTransAsyncCallback();
virtual ~ObEndTransAsyncCallback();
virtual void callback(int cb_param);
virtual void callback(int cb_param, const transaction::ObTransID &trans_id);
virtual const char *get_type() const { return "ObEndTransAsyncCallback"; }
virtual ObEndTransCallbackType get_callback_type() const { return ASYNC_CALLBACK_TYPE; }
observer::ObSqlEndTransCb &get_mysql_end_trans_cb() { return mysql_end_trans_cb_; }
void reset()
{
ObExclusiveEndTransCallback::reset();
mysql_end_trans_cb_.reset();
}
private:
/* macro */
observer::ObSqlEndTransCb mysql_end_trans_cb_;
DISALLOW_COPY_AND_ASSIGN(ObEndTransAsyncCallback);
};
}
}
#endif /* __OB_SQL_END_TRANS_CALLBACK_H__ */
//// end of header file