package com.taobao.tddl.repo.mysql.handler;
import com.taobao.tddl.common.exception.TddlException;
import com.taobao.tddl.common.utils.logger.Logger;
import com.taobao.tddl.common.utils.logger.LoggerFactory;
import com.taobao.tddl.executor.common.ExecutionContext;
import com.taobao.tddl.executor.common.KVPair;
import com.taobao.tddl.executor.common.TransactionConfig;
import com.taobao.tddl.executor.cursor.ISchematicCursor;
import com.taobao.tddl.executor.handler.HandlerCommon;
import com.taobao.tddl.executor.record.CloneableRecord;
import com.taobao.tddl.executor.repo.RepositoryConfig;
import com.taobao.tddl.executor.rowset.IRowSet;
import com.taobao.tddl.executor.spi.IDataSourceGetter;
import com.taobao.tddl.executor.spi.IRepository;
import com.taobao.tddl.executor.spi.ITHLog;
import com.taobao.tddl.executor.spi.ITable;
import com.taobao.tddl.executor.spi.ITransaction;
import com.taobao.tddl.monitor.Monitor;
import com.taobao.tddl.optimizer.config.table.IndexMeta;
import com.taobao.tddl.optimizer.core.plan.IDataNodeExecutor;
import com.taobao.tddl.optimizer.core.plan.IPut;
import com.taobao.tddl.repo.mysql.spi.DatasourceMySQLImplement;
import com.taobao.tddl.repo.mysql.spi.My_JdbcHandler;
import com.taobao.tddl.repo.mysql.utils.MysqlRepoUtils;
public abstract class PutMyHandlerCommon extends HandlerCommon {
public PutMyHandlerCommon(){
super();
dsGetter = new DatasourceMySQLImplement();
}
protected IDataSourceGetter dsGetter;
public Logger logger = LoggerFactory.getLogger(PutMyHandlerCommon.class);
@Override
public ISchematicCursor handle(IDataNodeExecutor executor, ExecutionContext executionContext) throws TddlException {
long time = System.currentTimeMillis();
IPut put = (IPut) executor;
My_JdbcHandler jdbcHandler = MysqlRepoUtils.getJdbcHandler(dsGetter, executor, executionContext);
// 用于测试终止任务 Thread.sleep(1000000000l);
buildTableAndMeta(put, executionContext);
ITransaction transaction = executionContext.getTransaction();
ITable table = executionContext.getTable();
IndexMeta meta = executionContext.getMeta();
boolean autoCommit = false;
ISchematicCursor result = null;
try {
result = executePut(executionContext, put, table, meta, jdbcHandler);
if (autoCommit) {
commit(executionContext, transaction);
}
} catch (Exception e) {
time = Monitor.monitorAndRenewTime(Monitor.KEY1, Monitor.ServerPut, Monitor.Key3Fail, time);
if (autoCommit) {
rollback(executionContext, transaction);
}
throw new TddlException(e);
}
time = Monitor.monitorAndRenewTime(Monitor.KEY1, Monitor.ServerPut, Monitor.Key3Success, time);
return result;
}
// move to JE_Transaction
protected void rollback(ExecutionContext executionContext, ITransaction transaction) {
try {
// if (historyLog.get() != null) {
// historyLog.get().rollback(transaction);
// }
transaction.rollback();
executionContext.setTransaction(null);
} catch (Exception ex) {
logger.error("", ex);
}
}
protected void commit(ExecutionContext executionContext, ITransaction transaction) throws TddlException {
// if (historyLog.get() != null) {
// historyLog.get().commit(transaction);
// }
if (transaction != null) transaction.commit();
// 清空当前事务运行状态
executionContext.setTransaction(null);
}
protected abstract ISchematicCursor executePut(ExecutionContext executionContext, IPut put, ITable table,
IndexMeta meta, My_JdbcHandler myJdbcHandler) throws Exception;
protected void prepare(ITransaction transaction, ITable table, IRowSet oldkv, CloneableRecord key,
CloneableRecord value, IPut.PUT_TYPE putType) throws TddlException {
ITHLog historyLog = transaction.getHistoryLog();
if (historyLog != null) {
historyLog.parepare(transaction.getId(), table.getSchema(), putType, oldkv, new KVPair(key, value));
}
}
protected TransactionConfig getDefalutTransactionConfig(IRepository repo) {
TransactionConfig tc = new TransactionConfig();
String isolation = repo.getRepoConfig().getProperty(RepositoryConfig.DEFAULT_TXN_ISOLATION);
// READ_UNCOMMITTED|READ_COMMITTED|REPEATABLE_READ|SERIALIZABLE
if ("READ_UNCOMMITTED".equals(isolation)) {
tc.setReadUncommitted(true);
} else if ("READ_COMMITTED".equals(isolation)) {
tc.setReadCommitted(true);
}
return tc;
}
}