python一套完整的事务操作

时间:2023-02-21 12:09:28
 1 #coding=utf-8
 2 import sys
 3 import MySQLdb
 4 
 5 class TransferMoney(object):
 6     def __init__(self,conn):
 7         self.conn = conn
 8 
 9     #检查账户是否合法
10     def check_acct_avaiable(self,acctid):
11         cursor = self.conn.cursor()
12         try:
13             sql = "select * from account where acctid=%s" % acctid
14             cursor.execute(sql)
15             print "check account:" + sql
16             rs = cursor.fetchall()
17             if len(rs) != 1:
18                 raise Exception("account %s illega" % acctid)
19         finally:
20             cursor.close()
21 
22     #检查是否有足够的钱
23     def has_enough_money(self,acctid,money):
24         cursor = self.conn.cursor()
25         try:
26             sql = "select * from account where acctid=%s and money > %s" % (acctid,money)
27             cursor.execute(sql)
28             print "has enough money:" + sql
29             rs = cursor.fetchall()
30             if len(rs) != 1:
31                 raise Exception("account %s not enough money" % acctid)
32         finally:
33             cursor.close()
34 
35     #账户减钱
36     def reduce_money(self,acctid,money):
37         cursor = self.conn.cursor()
38         try:
39             sql = "update account set money = money-%s where acctid = %s" % (money,acctid)
40             cursor.execute(sql)
41             print "reduce_money:" + sql
42             if cursor.rowcount != 1:
43                 raise Exception("reduce money fail %s" % acctid)
44         finally:
45             cursor.close()
46 
47     #账户加钱
48     def add_money(self,acctid,money):
49         cursor = self.conn.cursor()
50         try:
51             sql = "update account set money = money+%s where acctid = %s" % (money,acctid)
52             cursor.execute(sql)
53             print "add_money:" + sql
54             if cursor.rowcount != 1:
55                 raise Exception("add money fail %s" % acctid)
56         finally:
57             cursor.close()
58     #主执行语句
59     def transfer(self,source_acctid,target_acctid,money):
60         try:
61             self.check_acct_avaiable(source_acctid)
62             self.check_acct_avaiable(target_acctid)
63             self.has_enough_money(source_acctid,money)
64             self.reduce_money(source_acctid,money)
65             self.add_money(target_acctid,money)
66             self.conn.commit()
67         except Exception as e:
68             self.conn.rollback()
69             raise e
70 
71 if __name__ == "__main__":
72     source_acctid = sys.argv[1]
73     target_acctid = sys.argv[2]
74     money = sys.argv[3]
75     conn = MySQLdb.Connect(host = '127.0.0.1',port=3306,user='root',passwd='',db='test',charset='utf8')
76     tr_money = TransferMoney(conn)
77 
78     try:
79         tr_money.transfer(source_acctid,target_acctid,money)
80     except Exception as e:
81         print "Happen:" + str(e)
82     finally:
83         conn.close()