code: func (w *GCWorker) prepare() (bool, uint64, error) {
  	// Add a transaction here is to prevent following situations:
  	// 1. GC check gcEnable is true, continue to do GC
  	// 2. The user sets gcEnable to false
  	// 3. The user gets `tikv_gc_safe_point` value is t1, then the user thinks the data after time t1 won't be clean by GC.
  	// 4. GC update `tikv_gc_safe_point` value to t2, continue do GC in this round.
  	// Then the data record that has been dropped between time t1 and t2, will be cleaned by GC, but the user thinks the data after t1 won't be clean by GC.
  	ctx := context.Background()
  	_, err := w.session.Execute(ctx, "BEGIN")
  	if err != nil {
  		return false, 0, errors.Trace(err)
  	}
  	doGC, safePoint, err := w.checkPrepare(ctx)
  	if doGC {
  		_, err = w.session.Execute(ctx, "COMMIT")
  		if err != nil {
  			return false, 0, errors.Trace(err)
  		}
  	} else {
  		_, err1 := w.session.Execute(ctx, "ROLLBACK")
  		terror.Log(errors.Trace(err1))
  	}
  	return doGC, safePoint, errors.Trace(err)
  }
docs: // prepare checks preconditions for starting a GC job. It returns a bool
  // that indicates whether the GC job should start and the new safePoint.