Skip to content

Instantly share code, notes, and snippets.

@dbbbit
Last active September 26, 2015 02:51
Show Gist options
  • Save dbbbit/373e0547aa6f59e797c1 to your computer and use it in GitHub Desktop.
Save dbbbit/373e0547aa6f59e797c1 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
# 嵌套式事务
class OriginStore(object):
cache = []
success = []
def transaction_begin(self):
if len(self.cache):
raise Exception('another transaction not end yet')
cache = []
def execute(self, sql):
if sql == 'raise':
raise Exception('raise for test')
self.cache.append(sql)
def commit(self):
self.success.extend(self.cache)
self.cache = []
def rollback(self):
self.cache = []
ostore = OriginStore()
class Store(object):
level = 0
def __enter__(self):
print '[level: %s] enter, cache: %s, success: %s' % (self.level, ostore.cache, ostore.success)
assert self.level >= 0
self.level += 1
def __exit__(self, tp, value, tb):
print '[level: %s] exit, cache %s, success: %s' % (self.level, ostore.cache, ostore.success)
assert self.level >= 0
self.level -= 1
def begin(self):
if self.level == 0:
ostore.transaction_begin()
return self
def execute(self, sql):
print 'executing %s' % sql
ostore.execute(sql)
def commit(self):
print 'commit %s' % ostore.cache
if self.level in (0, 1):
ostore.commit()
def rollback(self):
print 'rollback %s' % ostore.cache
ostore.rollback()
s = Store()
def hello_world():
with s.begin():
try:
s.execute('hello')
s.execute('world')
do_break()
s.execute('fuck')
s.execute('bitch')
do_raise()
except:
s.rollback()
else:
s.commit()
def do_raise():
with s.begin():
s.execute('raise')
def do_break():
''' fix this to s.commmit() '''
ostore.commit()
def do_break():
''' fix this to s.commmit() '''
ostore.commit()
def main():
with s.begin():
try:
hello_world()
except:
s.rollback()
else:
s.commit()
if __name__ == '__main__':
hello_world()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment