数据库的事务机制:
事务机制可以确保数据一致性。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。


对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。
conn.commit()方法游标的所有更新操作,conn.rollback()方法回滚当前游标的所有操作。每一个方法都开始了一个新的事务。

python连接mysql需要用到MySQLdb这个模块,MySQLdb的常用方法有:
cur.fetchone() # 该方法获取下一个查询结果集。结果集是一个对象
cur.fetchall() # 接收全部的返回结果行

例1:

 1 # -*- coding: utf-8 -*-
 2 import MySQLdb
 3 
 4 host = "localhost"
 5 port = 3306
 6 user = "root"
 7 passwd = "pass"
 8 db = "my_test_db"
 9 
10 conn = MySQLdb.connect(host=host, port=port, user=user, passwd=passwd, db = db) # 打开数据库连接
11 cur = conn.cursor() # 使用cursor()方法获取操作游标
12 try:
13     sql = "insert into test values('str',1,-1)"
14     cur.execute(sql)
15     sql = "insert into te1st values('str',2,-2)" # 这是一条错误的sql,因为事务机制,所以上1条sql语句也不会执行
16     cur.execute(sql)
17     conn.commit() # 提交到数据库执行
18 except:
19     conn.rollback() # 发生错误时回滚
20 sql = "select * from test"
21 cur.execute(sql)
22 print cur.fetchall()
23 sql = "insert into test values('str',3,-3)" # 一条正确的插入语句
24 cur.execute(sql)
25 conn.commit() # 提交到数据库执行
26 sql = "select * from test"
27 cur.execute(sql)
28 print cur.fetchall()
29 conn.close() # 关闭数据库连接,一定要关闭,连接开太多会出问题

 

运行结果:

 

 

例2:

 1 # -*- coding: utf-8 -*-
 2 import MySQLdb
 3 
 4 host = "localhost"
 5 port = 3306
 6 user = "root"
 7 passwd = "pass"
 8 db = "my_test_db"
 9 
10 conn = MySQLdb.connect(host=host, port=port, user=user, passwd=passwd, db = db, charset='utf8') # 打开数据库连接,并设置编码
11 print conn.get_autocommit()
12 conn.autocommit(1) # 设置自动提交,默认为false
13 print conn.get_autocommit()
14 cur = conn.cursor() # 使用cursor()方法获取操作游标
15 try:
16     sql = "insert into test values('str',1,-1)"
17     cur.execute(sql)
18     sql = "insert into te1st values('str',2,-2)" # 这一条出错了并不会影响上一条sql语句的执行
19     cur.execute(sql)
20 except:
21     conn.rollback() # 发生错误时回滚
22 sql = "select * from test"
23 cur.execute(sql)
24 print cur.fetchall()
25 sql = "insert into test values('str',3,-3)" # 一条正确的插入语句
26 cur.execute(sql)
27 sql = "select * from test"
28 cur.execute(sql)
29 print cur.fetchall()
30 conn.close() # 关闭数据库连接,一定要关闭,连接开太多会出问题

运行结果:

 

posted on 2018-02-11 15:13  acgame  阅读(197)  评论(0编辑  收藏  举报