Mysql数据库事务二阶段提交正确性验证的想法
2011-11-30 15:06
351 查看
MySQL服务器为5.0.77版本,表类型为InnoDB。autocommit属性设置为False。 第一种:在代码和服务器端进行交叉验证 在MySQLdb中,首先把创建的数据库连接的autocommit属性设置为False(开始的时候zhang表式InnoDB类型的支持事务,只有一个属性列a int,只有一条数据(40) sql = "insert into zhang values(50)" cursor.execute(sql) sql = "insert into zhang values(60)" cursor.execute(sql) sql = "delete from zhang where a = 50" cursor.execute(sql) #到这个时候都是正确的,但是没有进行commit,查询时候结果是40、60,但是这个时候在服务器端(或者另外一个数据库连接中进行)查询 #结果是40;说明在数据库端有操作,但是并没有真正写入数据库,应该是在缓存中进行的,验证了事务提交第一阶段的正确性 sql = "select * from zhang" cursor.execute(sql) row = cursor.fetchone() while row: print str(row[0]) row = cursor.fetchone() #这里设置一个错误的更新操作,会捕捉到错误,然后进行rollback之后再进行查询,如果查询结果为40则说明rollback第二阶段提交#的正 确性 sql = "delete from zhan" cursor.execute(sql) conn.commit() #如果没有设置错误操作,则会提交给数据库,现在再进行查询,如果结果为40,则说明commit第二阶段提交的正确性 sql = "select * from zhang" cursor.execute(sql) row = cursor.fetchone() while row: print str(row[0]) row = cursor.fetchone() 第二种:在代码中使用两个数据库连接进行验证 #和上面的思路相同,只是转化为在代码中创建另外一个数据库连接代替在服务器端查询进行验证 sql = "insert into zhang values(50)" cursor.execute(sql) sql = "insert into zhang values(60)" cursor.execute(sql) sql = "delete from zhang where a = 50" cursor.execute(sql) #conn.commit() print "-----------------------------------------------------" sql = "select * from zhang" cursor.execute(sql) row = cursor.fetchone() while row: print str(row[0]) row = cursor.fetchone() print "-----------------------------------------------------" #创建另外一个数据库连接进行验证,这个和在服务器端进行ssh连接进行查询的效果上本质是相同的 conn1 = MySQLdb.connect(host='192.168.100.56',user='chang',passwd='123456',db='test') cursor1= conn1.cursor() sql = "select * from zhang" cursor1.execute(sql) row = cursor1.fetchone() while row: print str(row[0]) row = cursor1.fetchone() print "------------------------------------------------------" 第三种:使用两个ssh连接进行验证。首先在ssh1中set @@autocommit=0关闭自动提交 insert into zhang values(50); insert into zhang values(60); delete from zhang where a = 50; 之后在ssh1上进行查询,结果为40、60;在ssh2上进行查询,结果为40; 之后提交commit,在ssh1和ssh2上的查询结果均为40、60; 或者之后回滚rollback,这时在ssh1和ssh2上查询结果均为40. 综上:其实就是不同数据库连接直接的sql操作时相互独立的。ssh、数据库客户端管理工具和使用代码创建的数据库连接在本质上是等价的 。
相关文章推荐
- MongoDB数据库两阶段提交实现事务的方法详解
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
- XA: 事务和两阶段提交
- 分布式事务 - 两阶段提交与三阶段提交
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
- 关于分布式事务、两阶段提交协议、三阶提交协议
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
- MongoDB两阶段提交实现事务
- 分布式事务之两阶段提交(2pc)
- 事务基本特性和两阶段提交协议
- 事务与两阶段提交
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
- 两阶段提交协议,分布式事务控制(2PC)
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]
- 两阶段提交(2PC)协议与XA事务处理
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]
- 事务的两阶段提交协议概述
- 关于分布式事务、两阶段提交协议、三阶提交协议