码迷,mamicode.com
首页 > 数据库 > 详细

Python 执行 MySQL 事务

时间:2017-11-21 22:17:04      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:增加   隔离   let   需要   exception   except   用法   any   用户   

一、MySQL 事务

事务就是指逻辑上的一组 SQL 操作,组成这组操作的各个 SQL 语句,执行时要么全成功要么全失败。

举个例子,小明给小红转账100元,转账过程实际上就是小明的账户减少100元,小红的账户增加100元,对应的SQL语句为:

update account set money=money-5 where name=‘xiaoming‘;
update account set money=money+5 where name=‘xiaohong‘;

上述的两条SQL操作,在事务中的操作就是要么都执行成功,要么都执行失败,如果只有第一条成功,那么小明就损失100元,而小红并没有收到100元,这是不可取的,所以这就是事务,事务就是指逻辑上的一组 SQL 操作,组成这组操作的各个 SQL 语句,执行时要么全成功要么全失败。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行,在 MySQL 中只有使用了 Innodb 库引擎的数据库或表才支持事务,所以很多情况下我们都使用 Innodb 引擎.

事务的特性如下:

原子性:事务是一个不可分割的单位,事务中的所有 SQL 操作要么都成功,要么都失败
一致性:事务发生前和发生后,数据的完整性必须保持一致
隔离性:当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其它的会话是不可见的,多个并发事务之间的数据是相互隔离的
持久性:一个事务一旦被提交,它对数据库中的数据改变就是永久性的,如果出了错误,事务也不允许撤销,只能通过 "补偿性事务"

mysql> begin      # 开启事务
mysql> rollback   # 回滚事务
mysql> commit     # 提交事务

数据库默认事务是自动提交的,也就是说,当我们执行 select,insert,update,delete 等操作时,就会自动提交事务,如果关闭事务的自动提交,那么我们执行完 select,insert,update,delete 操作后需要再执行 commit 来提交事务,否则就不会执行

二、游标

游标是系统为用户开设的一个数据缓冲区,存放 SQL 语句的执行结果,用法如下:

In [1]: import MySQLdb

In [2]: c = MySQLdb.connect(user=root, passwd=pzk123, db=mysql)    # 连接数据库

In [3]: cus = c.cursor()                      # 创建一个游标对象

In [4]: cus.execute(select * from user;)    # 使用execute()方法可以执行SQL语句,执行后的结果会存在缓冲区
Out[4]: 4L

In [5]: result1 = cus.fetchone()              # 可以使用fetchone()来查看缓冲区的一条记录

In [6]: result2 = cus.fetchmany(3)            # 可以使用fetchmany()来查看缓冲区的多条记录
 
In [7]: result3 = cus.fetchall()              # 可以使用fetchall()来查看所有的记录

 

三、根据游标执行 MySQL 事务

#!/usr/bin/env python
import MySQLdb

def connect_mysql():
    db_config = {
        host: 127.0.0.1,
        port: 3306,
        user: root,
        passwd: pzk123
    }
    c = MySQLdb.connect(**db_config)
    return c

if __name__ == __main__:
    c = connect_mysql()              # 首先连接数据库
    cus = c.cursor()                 # 生成游标对象
    sql = drop database test;      # 定义要执行的SQL语句
    try:
        cus.execute(sql)             # 执行SQL语句
        c.commit()                   # 如果执行成功就提交事务
    except Exception as e: 
        c.rollback()                 # 如果执行失败就回滚事务
        raise e
    finally:
        c.close()                    # 最后记得关闭数据库连接

 

 

 

 

 

            

Python 执行 MySQL 事务

标签:增加   隔离   let   需要   exception   except   用法   any   用户   

原文地址:http://www.cnblogs.com/pzk7788/p/7875234.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!