Python实现完整的事务操作示例


Posted in Python onJune 20, 2017

本文实例讲述了Python事务操作实现方法。分享给大家供大家参考,具体如下:

#coding=utf-8
import sys
import MySQLdb
class TransferMoney(object):
  def __init__(self,conn):
    self.conn = conn
  #检查账户是否合法
  def check_acct_avaiable(self,acctid):
    cursor = self.conn.cursor()
    try:
      sql = "select * from account where acctid=%s" % acctid
      cursor.execute(sql)
      print "check account:" + sql
      rs = cursor.fetchall()
      if len(rs) != 1:
        raise Exception("account %s illega" % acctid)
    finally:
      cursor.close()
  #检查是否有足够的钱
  def has_enough_money(self,acctid,money):
    cursor = self.conn.cursor()
    try:
      sql = "select * from account where acctid=%s and money > %s" % (acctid,money)
      cursor.execute(sql)
      print "has enough money:" + sql
      rs = cursor.fetchall()
      if len(rs) != 1:
        raise Exception("account %s not enough money" % acctid)
    finally:
      cursor.close()
  #账户减钱
  def reduce_money(self,acctid,money):
    cursor = self.conn.cursor()
    try:
      sql = "update account set money = money-%s where acctid = %s" % (money,acctid)
      cursor.execute(sql)
      print "reduce_money:" + sql
      if cursor.rowcount != 1:
        raise Exception("reduce money fail %s" % acctid)
    finally:
      cursor.close()
  #账户加钱
  def add_money(self,acctid,money):
    cursor = self.conn.cursor()
    try:
      sql = "update account set money = money+%s where acctid = %s" % (money,acctid)
      cursor.execute(sql)
      print "add_money:" + sql
      if cursor.rowcount != 1:
        raise Exception("add money fail %s" % acctid)
    finally:
      cursor.close()
  #主执行语句
  def transfer(self,source_acctid,target_acctid,money):
    try:
      self.check_acct_avaiable(source_acctid)
      self.check_acct_avaiable(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 Exception as e:
      self.conn.rollback()
      raise e
if __name__ == "__main__":
  source_acctid = sys.argv[1]
  target_acctid = sys.argv[2]
  money = sys.argv[3]
  conn = MySQLdb.Connect(host = '127.0.0.1',port=3306,user='root',passwd='',db='test',charset='utf8')
  tr_money = TransferMoney(conn)
  try:
    tr_money.transfer(source_acctid,target_acctid,money)
  except Exception as e:
    print "Happen:" + str(e)
  finally:
    conn.close()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python获取本地计算机名字的方法
Apr 29 Python
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 Python
python 添加用户设置密码并发邮件给root用户
Jul 25 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
创建pycharm的自定义python模板方法
May 23 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
python matplotlib拟合直线的实现
Nov 19 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 Python
python tkinter模块的简单使用
Apr 07 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 #Python
Python实现多并发访问网站功能示例
Jun 19 #Python
Python sqlite3事务处理方法实例分析
Jun 19 #Python
Python之str操作方法(详解)
Jun 19 #Python
python urllib爬取百度云连接的实例代码
Jun 19 #Python
Python的IDEL增加清屏功能实例
Jun 19 #Python
利用python爬取散文网的文章实例教程
Jun 18 #Python
You might like
解决File size limit exceeded 错误的方法
2013/06/14 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
ASP中Sub和Function的区别说明
2020/08/30 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
浅析vue数据绑定
2017/01/17 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
详解Python中dict与set的使用
2015/08/10 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
vscode 远程调试python的方法
2017/12/01 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
python实现名片管理系统
2018/11/29 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
匈牙利墨盒和碳粉购买网站:CDRmarket
2018/04/14 全球购物
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
德国家具折扣店:POCO
2020/02/28 全球购物
俄罗斯三星品牌商店:Samsungstore
2020/04/05 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
remote接口和home接口主要作用
2013/05/15 面试题
往来会计岗位职责
2013/12/19 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书
大学生励志演讲稿
2014/04/25 职场文书
代理词怎么写
2015/05/25 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python