数据库的事务机制:
事务机制可以确保数据一致性。
事务应该具有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() # 关闭数据库连接,一定要关闭,连接开太多会出问题
运行结果: