您的位置:首页 > 数据库 > MySQL

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、数据库客户端管理工具和使用代码创建的数据库连接在本质上是等价的

。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: