#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一套完整的事务操作的更多相关文章

  1. python实现redis三种cas事务操作

    cas全称是compare and set,是一种典型的事务操作. 简单的说,事务就是为了存取数据库中同一数据时不破坏操作的隔离性和原子性,从而保证数据的一致性. 一般数据库,比如MySql是如何保证 ...

  2. python借助ADB工具实现自动化操作手机

    核心工具——ADB工具 adb工具用于连接Android手机和PC端,我们借助adb工具,就可以通过命令行对手机进行相应的操作 注意:若要通过adb操作手机,需打开手机的开发者模式,并打开USB调试功 ...

  3. Python之套接字

    Python之套接字 客户端Client/服务端Server架构: 1.硬件C/S架构 2.软件C/S架构 OSI4层:4层里有五层,五层里又有7层. 四层---------五层--------七层 ...

  4. (Python )格式化输出、文件操作、json

    本节学习Python的格式化输出,文件操作以及json的简单用法 1.格式化输出 将非字符串类型转换成字符串,可以使用函数:str() 或者repr() ,(这两个函数的区别目前我还没搞懂,求解答) ...

  5. Django 事务操作

    如何在Django中进行事务操作 案例: 客户A要给客户B转一笔钱,这个在数据库中需要进行两步: 1.客户A减钱 2.客户B加钱 如果在第一步结束后,服务器出现异常,停下了,第二步没有进行,如果数据库 ...

  6. spring学习(三) ———— spring事务操作

    前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...

  7. python---django中orm的使用(5)数据库的基本操作(性能相关:select_related,和prefetch_related重点)(以及事务操作)

    ################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...

  8. spring(三) spring事务操作

    前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...

  9. MySQL(存储过程,支持事务操作)

    day61 保存在MySQL上的一个别名   >   一坨SQL语句 -- delimiter // -- create procedure p1() -- BEGIN -- select * ...

随机推荐

  1. JavaWeb---图书馆管理系统

    写在开头,以后每天写记录. 今天,初步了解了一下,项目需求,用现在自己所学的知识,很多还不能做出来. 先用目前的知识,一步步的做出来,不断的完善,今天遇到的问题: 任务分析: 01.list页面的ad ...

  2. python学习笔记-socket

    socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  3. [python] 线程池

    特别感谢simomo 什么是线程池? 诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务.构建服务器应用程序的一个过于简单的模型是:每当一 ...

  4. 由struts错误使用引发的漏洞,使用参数作为返回的文件路径或文件名,作为返回result 值

    该错误可以导致他人任意访问该路径下的任何文件. struts 文件 <?xml version="1.0" encoding="UTF-8" ?> ...

  5. 工作中遇到的小问题: 做弹幕从数据库取出东西均匀插入marquee中,

    function getFloatContent() { var method = 'GETFLOATCONTENT'; $.ajax({ url: 'api/zhenqiapi.php', data ...

  6. 【jquery】:表单返回信息

    第一个页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  7. ClickOnce的部署(.appref-ms)在软件限制策略中的解决方案

    为了防止百度.360以及一些小厂商在妈妈的电脑里乱安装各种程序,在域中开启了软件限制策略. 今天在用Github的Windows客户端时发现由于软件限制策略无法运行. Github在Windows中采 ...

  8. Robot Framework-Windows版本安装

    Robot Framework-Mac版本安装 Robot Framework-Windows版本安装 Robot Framework-工具简介及入门使用 Robot Framework-Databa ...

  9. OpenGL(三)——函数大全

    概述 根据自己写的小程序对各个函数进行解释 OpenGL函数 1. 颜色 1.1  glShadeModel 绘制指定两点间其他点颜色的过渡模式 没试 1.2  glColor 设置当前颜色:可以派生 ...

  10. 第三天:DOM EventListener 句柄的添加和移除

    1.事件句柄的包含如下两个方法: ps:使用句柄的好处是,修改方法的名称时,不需要改变多处 1.添加一个句柄, 2.添加多个句柄不会覆盖,运行结果:点击“按钮”,弹出框hello,确定后,自动弹出框w ...