def run_in_transaction_custom_retries(retry, function, *args, **kwargs): MYSQL_WAIT_MAX = 3 count = retry start_time = OSAUtil.get_now() while True: try: return transaction_sub(function, *args, **kwargs) except AppError: # apperrorは意図的に出しているからスルー. raise except CabaretError: # apperrorは意図的に出しているからスルー. raise except TimeoutError: # db接続タイムアウト. raise except OperationalError: # mysqlの接続等のエラー. now = OSAUtil.get_now() dif = now - start_time if dif.seconds < MYSQL_WAIT_MAX: time.sleep(0.1) else: info = sys.exc_info() trace = CabaretError.makeErrorTraceString(info) raise CabaretError(trace, CabaretError.Code.TOO_MANY_TRANSACTION) except: if count <= 0: raise count -= 1 time.sleep(0.01)
def save_custom_retries(method, *args, **kwargs): """書き込みリトライメソッド. トランザクションをはっていないときに呼ばれる. """ start_time = OSAUtil.get_now() while True: try: return method(*args, **kwargs) except TimeoutError: # db接続タイムアウト. raise except OperationalError: # mysqlの接続等のエラー. now = OSAUtil.get_now() dif = now - start_time if dif.seconds < 3: time.sleep(0.1) else: info = sys.exc_info() trace = CabaretError.makeErrorTraceString(info) raise CabaretError(trace, CabaretError.Code.TOO_MANY_TRANSACTION)
def handle(self, *args, **options): print '================================' print 'make_local_master' print '================================' filepath = os.path.join(os.path.dirname(__file__), '../../models/localdata/master.json') print '---------------' print 'file: %s' % filepath print '---------------' f = None try: f = open(filepath, "r") jsonstr = f.read() modellist = MasterData.update_from_json(jsonstr) print 'success:record num=%d' % len(modellist) except: print 'error: %s' % CabaretError.makeErrorTraceString( sys.exc_info()) finally: if f: f.close()