介绍
介绍
福哥在使用Python的pymysql进行开发的时候发现了一个问题,如果在Python程序运行结束之前通过MySQL的控制台终端对数据库里面的数据进行了更新的话,再在Python里面去查询的时候发现数据竟然是更新之前的旧内容,这是怎么回事呢?
事务机制
InnoDB
原来是因为默认情况下MySQL的数据库的引擎都是InnoDB类型的,而InnoDB类型的数据库是支持事务机制的,所谓事务机制简单解释就是会给每一个连接到MySQL服务器的终端分配一块内存,所有的数据和数据库里面的数据都是隔离的,在提交事务之前任何其他终端所做的更改都不会影响当前终端下面的数据。
而pymysql相对于MySQL来说也是一个终端,在提交之前也不会受其他终端的更改的影响,当然福哥在MySQL的控制台终端的更改也不会在pymysql里面查询得到了。
事务提交
如果想让pymysql里面可以查询到其他终端提交的最新数据的话,需要在每一次执行SELECT语句之后进行一次提交才可以。提交可以通过手动方式或者自动方式,福哥写了一个循环,每次查询user表的全部数据。
下面分别演示了手动提交和自动提交方式下的程序是如何编写的,大家可以参看看~~
手动提交
手动提交很简单,就是在使用游标执行SELECT语句之后,使用连接提交一下,再去获取数据就会是最新的了。
try: while True: cursorDict.execute("select * from user order by userID desc") cn.commit() users = cursorDict.fetchall() print("数据表user的数据列表") print("") for user in users: print(str(user["userID"]) + "@" + user["userName"]) print("") # wait time.sleep(10) except Exception as e: print(e)
自动提交
每次执行一条命令都要提交一下有点麻烦,怎么办?可以在创建MySQL连接的时候开启自动提交模式。
在使用pymysql.connect创建连接的时候传入参数autocommit=True开启自动提交模式。
try: cn = pymysql.connect("192.168.2.168", "root", "abcdef", db="tfums", charset="utf8", autocommit=True) cursor = cn.cursor() cursorDict = cn.cursor(pymysql.cursors.DictCursor) except Exception as e: print(e) exit() try: while True: cursorDict.execute("select * from user order by userID desc") users = cursorDict.fetchall() print("数据表user的数据列表") print("") for user in users: print(str(user["userID"]) + "@" + user["userName"]) print("") # wait time.sleep(10) except Exception as e: print(e)
总结
今天福哥给童鞋们讲解了关于MySQL的InnoDB的事务机制的知识,以及在使用Python通过pymysql查询MySQL数据的时候,如何避免因为MySQL的InnoDB的事务机制导致的无法查询到最新数据的问题的方法。