示例#1
0
func (sq *SqlQuery) Begin(context *Context, session *proto.Session, txInfo *proto.TransactionInfo) (err error) {
	logStats := newSqlQueryStats("Begin", context)
	logStats.OriginalSql = "begin"
	defer handleError(&err, logStats)
	sq.checkState(session.SessionId, false)

	txInfo.TransactionId = sq.qe.Begin(logStats)
	return nil
}
示例#2
0
// Begin is part of the queryservice.QueryService interface
func (f *FakeQueryService) Begin(ctx context.Context, session *proto.Session, txInfo *proto.TransactionInfo) error {
	if f.hasError {
		return testTabletError
	}
	if f.panics {
		panic(fmt.Errorf("test-triggered panic"))
	}
	if session.SessionId != testSessionID {
		f.t.Errorf("Begin: invalid SessionId: got %v expected %v", session.SessionId, testSessionID)
	}
	if session.TransactionId != 0 {
		f.t.Errorf("Begin: invalid TransactionId: got %v expected 0", session.TransactionId)
	}
	txInfo.TransactionId = beginTransactionID
	return nil
}
示例#3
0
// Begin is part of the queryservice.QueryService interface
func (f *FakeQueryService) Begin(ctx context.Context, target *pb.Target, session *proto.Session, txInfo *proto.TransactionInfo) error {
	if f.panics {
		panic(fmt.Errorf("test-triggered panic"))
	}
	if f.checkExtraFields {
		f.checkTargetCallerID(ctx, "Begin", target)
	} else {
		if session.SessionId != testSessionID {
			f.t.Errorf("Begin: invalid SessionId: got %v expected %v", session.SessionId, testSessionID)
		}
	}
	if session.TransactionId != 0 {
		f.t.Errorf("Begin: invalid TransactionId: got %v expected 0", session.TransactionId)
	}
	txInfo.TransactionId = beginTransactionID
	return nil
}
示例#4
0
// Begin starts a new transaction. This is allowed only if the state is SERVING.
func (sq *SqlQuery) Begin(context *Context, session *proto.Session, txInfo *proto.TransactionInfo) (err error) {
	logStats := newSqlQueryStats("Begin", context, sq.config.SensitiveMode)
	logStats.OriginalSql = "begin"
	sq.mu.RLock()
	defer sq.mu.RUnlock()
	defer handleError(&err, logStats)
	if sq.state.Get() != SERVING {
		return NewTabletError(RETRY, "cannot begin transaction in state %s", sq.GetState())
	}
	// state is SERVING
	if session.SessionId == 0 || session.SessionId != sq.sessionId {
		return NewTabletError(RETRY, "Invalid session Id %v", session.SessionId)
	}

	txInfo.TransactionId = sq.qe.Begin(logStats)
	return nil
}
示例#5
0
// Begin starts a new transaction. This is allowed only if the state is SERVING.
func (sq *SqlQuery) Begin(context context.Context, session *proto.Session, txInfo *proto.TransactionInfo) (err error) {
	logStats := newSqlQueryStats("Begin", context)
	logStats.OriginalSql = "begin"
	sq.mu.RLock()
	defer sq.mu.RUnlock()
	defer handleError(&err, logStats)
	if sq.state.Get() != SERVING {
		return NewTabletError(RETRY, "cannot begin transaction in state %s", sq.GetState())
	}
	// state is SERVING
	if session.SessionId == 0 || session.SessionId != sq.sessionId {
		return NewTabletError(RETRY, "Invalid session Id %v", session.SessionId)
	}
	defer queryStats.Record("BEGIN", time.Now())
	txInfo.TransactionId = sq.qe.activeTxPool.Begin()
	logStats.TransactionID = txInfo.TransactionId
	return nil
}
示例#6
0
// Begin starts a new transaction. This is allowed only if the state is StateServing.
func (sq *SqlQuery) Begin(ctx context.Context, session *proto.Session, txInfo *proto.TransactionInfo) (err error) {
	logStats := newSqlQueryStats("Begin", ctx)
	logStats.OriginalSql = "begin"
	defer handleError(&err, logStats, sq.qe.queryServiceStats)

	if err = sq.startRequest(session.SessionId, false, false); err != nil {
		return err
	}
	ctx, cancel := withTimeout(ctx, sq.qe.txPool.PoolTimeout())
	defer func() {
		sq.qe.queryServiceStats.QueryStats.Record("BEGIN", time.Now())
		cancel()
		sq.endRequest()
	}()

	txInfo.TransactionId = sq.qe.txPool.Begin(ctx)
	logStats.TransactionID = txInfo.TransactionId
	return nil
}
示例#7
0
// Begin starts a new transaction. This is allowed only if the state is StateServing.
func (tsv *TabletServer) Begin(ctx context.Context, target *pb.Target, session *proto.Session, txInfo *proto.TransactionInfo) (err error) {
	logStats := newLogStats("Begin", ctx)
	logStats.OriginalSQL = "begin"
	defer handleError(&err, logStats, tsv.qe.queryServiceStats)

	if err = tsv.startRequest(target, session.SessionId, false); err != nil {
		return err
	}
	ctx, cancel := withTimeout(ctx, tsv.BeginTimeout.Get())
	defer func() {
		tsv.qe.queryServiceStats.QueryStats.Record("BEGIN", time.Now())
		cancel()
		tsv.endRequest()
	}()

	txInfo.TransactionId = tsv.qe.txPool.Begin(ctx)
	logStats.TransactionID = txInfo.TransactionId
	return nil
}
示例#8
0
// AddTabletErrorToTransactionInfo will mutate a TransactionInfo struct to fill in the Err
// field with details from the TabletError.
func AddTabletErrorToTransactionInfo(err error, reply *proto.TransactionInfo) {
	if err == nil {
		return
	}
	reply.Err = rpcErrFromTabletError(err)
}