Mongodb事务模拟

1、创建事务表,添加一条记录,如果成功,执行第2步,如果失败,则事务失败。



2、将该事务的ID标志加在要执行事务的一批数据上,并添加状态字段:待插入状态。然后执行批量写操作。如果成功,则执行第3步,如果失败,则执行第6步。



3、update mult 待插入状态 -> 成功状态。

如果成功,执行第4步。如果失败,执行第6步。



4、删除事务表当前批次事务数据。如果成功,执行第5步,如果失败执行第6步。



5、事务提交成功。



6、执行3次清道夫程序,如果成功则事务回滚成功,如果失败,则交由清道夫守护程序再定时执行。

    1)mult删除该事务批次状态为“待插入状态”的数据

    2)删除事务表事务记录。





注:写操作时无论是C U D,均为新增一条记录,并将version+1,取记录永远取version最新的数据。此处实现有一定逻辑,非本文重点,清道夫守护线程也非本文重点,均不再熬述。



-------------


•第1步:先记录一条事务记录,将要修改的多行记录的修改值写到里面,并设置其状态为init(如果这时候操作中断,那么在重新启动时,会判断到它处于init状态,从而将其保存的多行修改操作应用到具体的行上)。
•第2步:然后更新具体要修改的行,将刚才写的事务记录的标识写到它的tran字段中。
•第3步:将事务记录的状态从init变成pending(如果在这时候操作中断,那么在重新启动时,会判断到它的状态是pending,这时查看其所有对应的多条要修改的记录,如果其tran值不为空,那么就进行第4步;如果值为空,说明第4步已经执行过了,直接将其状态从pending变成 commited就行)。
•第4步:将需要修改的多条记录的相应值加以修改,并且unset掉之前的tran字段。
•第5步:将事务记录那一条的状态从pending变成commited,事务至此完成。

原文来自 http://jdkleo.iteye.com/blog/2009974

猜你喜欢

转载自btbear.iteye.com/blog/2084288