Atitit 数据库事务实现原理
1.1. 自己在程序中实现事务操作。
如果只是需要事务的话,你自己给mongo操作加上事务功能就可以啦。。数据库事务只不过是他自己实现了而已。。如果数据库不支持事务,就要你在代码里面实现事务就可以了。。
最简单方便的就是使用日志方式来做事务就可以了。。
比如插入俩个数据。每执行一个sql,就生成一个undo日志即可。。
Undo日志表如下字段(事务id,表格名称,操作【insert,update,delete】,原记录id,新记录id)
如果后面的sql失败了。那么根据undo日志,撤销掉前面执行的sql数据即可。
主要流程如下。根据事务id,得到前几个sql语句新增的记录id,然后删除这几个id的数据即可。。
如果提交成功,那么可以删除掉此事务id对应的undo日志即可。。
1.2. 事务有两种方式达到这样的目的: Shadow copies/pages(影像拷贝/影像页面): 每ransaction log (事务日志)
Shadow copies/pages(影像拷贝/影像页面): 每个事务拷贝一份自己的数据库(或者是数据库的一部分),在这份拷贝上操作。出错了,就删除这份拷贝。成功后,使用文件系统的功能 做一下文件交换,替换掉旧的数据。
Transaction log (事务日志):Transaction log是这样一块存储区域–在事务将数据写到磁盘之前先将信息写到Transaction log文件。这样,如果服务发生崩溃、事务被取消;数据库清楚如果根据日志删除数据,或者继续完成未完成的操作。
1.3. innodb通过undo log和redo log来实现。
事务中,每当执行一条SQL语句对数据产生了影响,就会记录下来与之相反的操作到undo log(撤销日志)中,例如,更新会记录之前的状态,删除会形成insert,添加会形成delete,一旦事务被回滚,则执行undo log中记录的操作,来完成恢复到之前的状态。这里是个 逻辑恢复哦!
同时,每当执行一条事务中的SQL,会将操作记录到redo log中,此时事务一旦被提交,就将该redolog中的操作,持久化到磁盘上,数据就持久的记录下来了(ACID的D)。
PS:还有,undolog才是原子性的关键
2. 隔离级别的概念
关系型数据库工作原理-事务管理(二) - 数据库其他综合 - 红黑联盟.html
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:[email protected]
转载请注明来源: http://www.cnblogs.com/attilax/
Atiend