|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2007-06-01
[quote="ahuaxuan第一,如果你的数据库支持事务,而且默认隔离级别是读写已提交的话(大部分数据库是这样),是不会出现什么脏数据的。可以仔细阅读一下事务和隔离级别,和不同隔离级别所能解决的情况。读写已提交就是解决脏读问题的
[/quote] 这个我很清楚地,你大概没搞清楚我的问题,这个算了, 我想问你,事务里面的一二级缓存是怎么实现同步的,比如事务里面更新了一个对象,h什么时候通知二级缓存同步对象的状态,以及h是怎么知道什么时候更新二级缓存,什么时候从二级里面删除数据 |
|
| 返回顶楼 | |
|
时间:2007-06-01
ellie4c 写道 这个我很清楚地,你大概没搞清楚我的问题,这个算了, 我想问你,事务里面的一二级缓存是怎么实现同步的,比如事务里面更新了一个对象,h什么时候通知二级缓存同步对象的状态,以及h是怎么知道什么时候更新二级缓存,什么时候从二级里面删除数据 1,之前你说的有一个脏提交的概念,这个我不知道你是什么意思,你是指发送sql语句给数据库吗。 但是调用save方法并不会发送sql语句到db,除非你再调用flush方法。 2,我说了:什么时候把数据同步到数据库,什么时候就把数据同步到二级缓存。 |
|
| 返回顶楼 | |
|
时间:2007-06-01
ahuaxuan 写道 ellie4c 写道 这个我很清楚地,你大概没搞清楚我的问题,这个算了, 我想问你,事务里面的一二级缓存是怎么实现同步的,比如事务里面更新了一个对象,h什么时候通知二级缓存同步对象的状态,以及h是怎么知道什么时候更新二级缓存,什么时候从二级里面删除数据 1,之前你说的有一个脏提交的概念,这个我不知道你是什么意思,你是指发送sql语句给数据库吗。 但是调用save方法并不会发送sql语句到db,除非你再调用flush方法。 2,我说了:什么时候把数据同步到数据库,什么时候就把数据同步到二级缓存。 |
|
| 返回顶楼 | |
|
时间:2007-06-01
ellie4c 写道 ahuaxuan 写道 ellie4c 写道 这个我很清楚地,你大概没搞清楚我的问题,这个算了, 我想问你,事务里面的一二级缓存是怎么实现同步的,比如事务里面更新了一个对象,h什么时候通知二级缓存同步对象的状态,以及h是怎么知道什么时候更新二级缓存,什么时候从二级里面删除数据 1,之前你说的有一个脏提交的概念,这个我不知道你是什么意思,你是指发送sql语句给数据库吗。 但是调用save方法并不会发送sql语句到db,除非你再调用flush方法。 2,我说了:什么时候把数据同步到数据库,什么时候就把数据同步到二级缓存。 |
|
| 返回顶楼 | |
|
时间:2007-06-01
我的理解是在事务提交的时候,首先在二级缓存中根据id找到对应的数据,然后通过session中的指令来判断是更新这个数据还是删除这个数据,通过这样的方法,同步了二级缓存之后,再向db发送sql语句,随后向db发送事务提交指令,但我没有看过源代码,应该是类似这样的
也有可能是在事务提交之后更新二级缓存,这样也许更合理,因为如果事务回滚,二级缓存就根本都不会涉及到了 |
|
| 返回顶楼 | |
|
时间:2007-06-01
这样的话 如果一个对象有多个操作指令的话 比如insert(a),update(a),delete(a)全部在一个事务里面的话,这样同步起来代价就太大了,不知道其他看过代码的人 有没有什么想法
|
|
| 返回顶楼 | |
|
时间:2007-06-01
ellie4c 写道 这样的话 如果一个对象有多个操作指令的话 比如insert(a),update(a),delete(a)全部在一个事务里面的话,这样同步起来代价就太大了,不知道其他看过代码的人 有没有什么想法
第一你要考虑到实际开发中有没有这种问题,第二,save之后的update只不过是操作一级缓存,没有同步的问题,delete也是如此,怎么会有同步的问题??? |
|
| 返回顶楼 | |
|
时间:2007-06-01
这是算法里面应该考虑的一种情况,我们不要偏离主题,你上面的根据指令来判断 应该会有这种情况,我想听听有没有那位高手看懂过里面的算法实现?我一向觉得不能只会用。
|
|
| 返回顶楼 | |
|
时间:2007-06-03
hibernate 没用过,不过根据我用另一个python下的类似hibernate的ORM的经验,你们所谓的一级二级缓存应该是这样的吧:
session = create_session() user = User(name='hello',...) # 这个是所谓的二级缓存? session.save(user) # 这里还没有实际操作数据库 莫非就是你们所谓的更新了一级缓存? session.flush() # 这里修改了数据库了 不过在我看来这里并没有两级缓存,user.save() 时只是让 ORM 记录下来有一个 user 需要 save 了。包括属性的修改也是如此,当修改一个属性的值时,ORM 会先记下这个需要更新的对象。 也就是说在 user.save() 后,session.flush() 前查询 user 表,应该是得不到刚创建的这个 user 对象的。 ORM 在最后 session.flush() 时要干比较多的事情,根据所记录下的对象的保存修改删除等变化,并通过分析各个表之间的外键关联等,得出一个合适的 SQL 实际执行的顺序,这里用到的算法叫做 topological sort。 另外 SQLAlchemy 里还有个像是缓存的东西:Identity Map(简单搜了一下,这个概念应该是来自 Hibernate 的),莫非这就是你们所说的一级缓存?不过我觉得这东西就作用来看应该不能算是缓存,只是用来保持数据一致性的。 |
|
| 返回顶楼 | |
|
时间:2007-06-03
我最近在看它的源码,没什么用,不过我觉得这样的算法大家觉得行不行,就是orm框架 每次都记录一级缓存里面对象的最后的操作状态,不管它前面执行过么操作,在最后提交以后遍历整个一级缓存的map同步。
如果事 insert:新增到二级缓存 update:新增或更新到二级缓存 delete:查找二级缓存找到就删除 select:不做操作, 但是select操作会发生一种例外就是先insert/update再select所以 select操作只是从二级缓存到一级缓存或者DB到一级的时候记录select操作,如果这个对象再一级缓存里面已经存在,就算他再次被查找到也不去更新他的select操作。这样的算法大家看看有没有什么问题,还有其他的好点的算法吗? |
|
| 返回顶楼 | |





