Base de données d'exploitation Python simulant les transactions de virement bancaire

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

  1. Une unité d'exécution de programme pour accéder et mettre à jour la base de données
  2. Atomicité: toutes les opérations incluses dans la transaction sont soit effectuées, soit non effectuées
  3. Cohérence: la transaction doit changer la base de données d'un état cohérent à un autre état cohérent
  4. Isolement: l'exécution d'une chose ne peut pas être perturbée par d'autres affaires
  5. 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

Insérez la description de l'image ici

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()

Je suppose que tu aimes

Origine blog.csdn.net/Uridis/article/details/88386229
conseillé
Classement