Base de données d'exploitation Python simulant les transactions de virement bancaire
Analyse, introduction
Ce code simule les opérations de virement bancaire; tout d'abord, vous devez comprendre les transactions de base de données, puis vous devez savoir comment utiliser les transactions;
Affaires
- Une unité d'exécution de programme pour accéder et mettre à jour la base de données
- Atomicité: toutes les opérations incluses dans la transaction sont soit effectuées, soit non effectuées
- Cohérence: la transaction doit changer la base de données d'un état cohérent à un autre état cohérent
- Isolement: l'exécution d'une chose ne peut pas être perturbée par d'autres affaires
- Persistance: une fois qu'une transaction est validée, ses modifications dans la base de données sont permanentes
Comment utiliser les transactions en développement?
- Désactiver la validation automatique: définissez conn.autocommit (False)
- Terminez la transaction normalement: conn.commit ()
- Fin de transaction anormale: conn.rollback ()
Icône d'opération
Code ouvert
案例:模拟银行转账
#coding=utf-8
importsys
import MySQLdb
class TransferMoney(object):
def__init__(self,conn):
self.conn=conn
def transfer(self,source_acctid,target_acctid,money):
try:
self.check_acc_available(source_acctid)
self.check_acc_available(target_acctid)
self.has_enough_money(source_acctid,money)
self.reduce_money(source_acctid,money)
self.add_money(target_acctid,money)
self.conn.commit()
except Exceptionase:
self.conn.rollback()
raisee
def check_acc_available(self,acctid):
cursor=self.conn.cursor()
try:
sql="select*fromaccountwhereacctid=%s"%acctid
cursor.execute(sql)
print"check_acctid_available:"+sql
rs=cursor.fetchall()
if len(rs)!=1:
raise Exception("账号%s不存在"%acctid)
finally:
cursor.close()
def has_enough_money(self,acctid,money):
cursor=self.conn.cursor()
try:
sql="select*fromaccountwhereacctid=%sandmoney>%s"%(acctid,money)
cursor.execute(sql)
print"has_enough_money:"+sql
rs=cursor.fetchall()
if len(rs)!=1:
raiseException("账号%s没有足够的钱"%acctid)
finally:
cursor.close()
def reduce_money(self,acctid,money):
cursor=self.conn.cursor()
try:
sql="updateaccountsetmoney=money-%swhereacctid=%s"%(money,acctid)
cursor.execute(sql)
print"reduce_money:"+sql
rs=cursor.fetchall()
if cursor.rowcount!=1:
raise Exception("账号%s减款失败"%acctid)
finally:
cursor.close()
def add_money(self,acctid,money):
cursor=self.conn.cursor()
try:
sql="updateaccountsetmoney=money+%swhereacctid=%s"%(money,acctid)
cursor.execute(sql)
print "reduce_money:"+sql
rs=cursor.fetchall()
if cursor.rowcount!=1:
raise Exception("账号%s加款失败"%acctid)
finally:
cursor.close()
if__name__=='__main__':
source_acctid=11
target_acctid=12
money=100
conn = MySQLdb.connect(
host='127.0.0.1',
user='root',
passwd='root',
port=3306,
db='imooc'
)
tr_money=TransferMoney(conn)
try:
tr_money.transfer(source_acctid,target_acctid,money)
except Exceptionase:
print"出现问题:"+str(e)
finally:
conn.close()