java/c++变量作用域的一点小区别
偶然遇到一个问题,java里面这么写是有问题的
int x = 1;
{
int x = 2;
}
作为一个写了多年C++的人,不能忍啊。java子域里的变量看样子不会覆盖父域。但是这样是没问题的,可见子域的生命周期还是局限于子域里面。
{
int x = 2;
}
int x = 1;
C++里面这样是没问题的
int x = 1 ;
{
int x = 2;
}
相对于脚本语言,这种限制似乎就宽多了。这样都可以。
for i in range(1,10):
pass
print i
Ich war noch niemals in New York
</embed>
我从来没有去过纽约
从没有到过夏威夷
从未穿过牛仔衣淋着旧金山的雨
我从来没有去过纽约
我要感受那远方的空气
我想要挣脱过去释放我自己
命名空间和友元冲突
今天遇到一个问题,需要跨namespace定义友元,这种情况比较常见的是测试类需要访问源码类,gtest据说有个FRIEND_TEST宏,以前用过好像有问题。这里我们直接用友元:
namespace oceanbase
{
namespace election
{
class ObElectionServer : public ObSingleServer
{
friend class ObElectionTester;
...
}
}
}
namespace oceanbase
{
namespace tests
{
namespace election
{
c...
两阶段提交协议的异常处理
两阶段提交的协议大家都比较熟悉了,解释一下每个阶段的异常处理。首先,我们需要持久化协议过程中的状态,这样如果server宕机,那么恢复的时候还能通过日志知道宕机前处于那个阶段。同时,所有对数据的修改都会先写write ahead log,保证宕机重启的之后数据也不会丢失。写日志的顺序假定为:写write ahead log-修改缓冲区-写commit/abort log。
在这个前提下,我们根据如下的时序图来讨论异常情况和处理方法。
过程a没有成功,即协调者没有收到部分参与者的回应。超时后,协调者发送abort消息给参与者取消事务。参与者存在两种情况:
- 过程1失败,网络问题导致参与者没有收到vote request消息或者此时参与者宕机。参与者重启恢复后无需...
undo 日志和redo 日志
具体的可以看这里,解释几个作者没解释清楚的问题:
只用REDO日志为什么数据修改要每次修改刷盘
如果不刷盘,不会导致数据不一致,但是数据修改过程相当于写redo日志-修改内存-写commit日志(修改内存的顺序也无所谓了),这个过程结束已经应答用户了,但是修改没有刷下去断电恢复的话也无法通过redolog恢复到当前状态,所以会丢失修改。
修改数据和写redo/undo log/commit log之间的关系是什么
任何对磁盘的数据修改落实之前都需要先写log,无论是redo还是undo。undo保证了一旦数据写了一半(脏数据)能够回滚,redo保证了写了日志的事务能够回放出来。
只使用undo的时候commit日志要等...
484 post articles, 61 pages.