MySQLdb Python模块autocommit属性测试及测试过程中关于数据库连接的理解

Tags: python

MySQLdb事务自动提交功能验证,服务器为MySQL5.0.77。更加要注意的是:数据库中表类型必须是InnoDB,因为这种类型才支持事务!!!

设置自动提交为True,包含多条sql语句
全部执行?查看数据库内容验证
如果从这里和服务器端查询结果都是50、20、30说明是全部执行的
结果:在服务器端查询结果是50、20、30说明都执行了,但是在程序中这样执行报错,说明是API不能这么使用的问题,但是在服务器端的确

sql = "select * from zhang;insert into zhang values(50);insert into zhan values(20);insert into zhang values(30)"
cursor.execute(sql)
sql = "insert into zhang values(100)"
cursor.execute(sql)sql = "select * from zhang"
cursor.execute(sql)
row = cursor.fetchone()
while row:
 print str(row[0])
 row = cursor.fetchone()

成功了

sql = "insert into zhang values(10)"
cursor.execute(sql)
sql = "insert into zhang values(15)"
cursor.execute(sql)
sql = "select * from zhang"
cursor.execute(sql)
row = cursor.fetchone()
while row:
 print str(row[0])
 row = cursor.fetchone()
sql = "insert into zhang values(20)"
cursor.execute(sql)
sql = "select * from zhang"
cursor.execute(sql)
row = cursor.fetchone()
while row:
 print str(row[0])
 row = cursor.fetchone()
sql = "insert into zhang values(30)"
cursor.execute(sql)
sql = "select * from zhang"
cursor.execute(sql)
row = cursor.fetchone()
while row:
 print str(row[0])
 row = cursor.fetchone()

这样就完全没有任何问题
注意:执行sql语句的时候,尽管把把所有sql语句写到一个execute函数和分别把sql写到多个execute中在服务器端效果是相同的,但是如

果这样,在这个数据库连接中接下来就无法继续执行sql语句了(注意在另一个数据库连接中还是可以继续执行sql语句的,应该就是各个数

据库连接之间的数据库操作时相互独立的,并且具有各自独立的执行缓存,这个在进行手动提交事务设置的时候才会明显的感受到),一旦

执行就会报Command out of sync,所以这个时候不要在一个execute中使用多条sql语句,每个execute中只能写一条sql语句!!!

2.设置autocommit为False
也会出现以上相同的情形(不可在同一个execute中写多条sql语句),不同的就是如果对数据进行了更新操作但是没有进行commit的话,使

用代码查询和在服务器端查询的结果可能是不一样的(使用数据库客户端管理工具,重新创建一个数据库连接进行查询的结果是相同的,应

该是为每个连接设置了一个缓存),这个是正常的和事务的两阶段提交机制相符,没有提交的时候没有真正写入数据库,在服务器端查询出

的结果实际上是另一个数据库连接进行查询的结果,每个连接都是在自己的缓存模块中进行查询。所以对更新功能的sql语句,在同一个数据

库连接中,进行数据库更新之后在进行查询之前一定要进行commit操作(也就是说在同一个数据库连接中,如果开启了事务手动提交,如果

想得到真实的结果,必须对在这个查询之前的更新操作进行提交或者回滚),否则就会造成查询出的结果不准确、查询出的结果并不是数据

库中实存储的结果的脏读的问题。
但是这个脏读得结果也是很有用的,可以用来进行事务二阶段提交中第一阶段提交的结果是否正确的验证!!!

综上所述:我们在做实际的数据库管理系统的时候,每当与数据库交互的时候都是单独地创建一个数据库连接---执行sql操作---得到结

果---关闭这个连接,一般查询就是查询,更新就是更新,没有出现过更新---查询---更新的操作,并且都是单线程的进行执行,所以当时无

法完全体会到数据库多个不同连接之间和同一个数据库连接中进行sql操作细微但是关键的不同之处。经过上述实验可以看到,各个数据库连

接直接的sql操作时相互独立的,同一个数据库连接中的sql操作是相关的,特别是设置为手动提交事务的时候可以深刻体会到这一点。

本文链接:http://www.4byte.cn/learning/120087/mysqldb-python-mo-kuai-autocommit-shu-xing-ce-shi-ji-ce-shi-guo-cheng-zhong-guan-yu-shu-ju-ku-lian-jie-de-li-jie.html