我不是DBA,而且我在理解Oracle的事务管理流程时遇到了一些困难.
通过阅读互联网上一些看起来很可靠的页面(最值得注意的是这个AskTom注释 - 但不要轻视这些注释)我理解了这一点,当提交一个事务时,新数据还没有在实际数据块上报告,但保持登录回滚段.当有人对数据发出SELECT时,或者当UNDO_RETENTION秒已经过去时 - 无论这两个事件中的哪一个先发生 - 那么新数据就会(然后才会)写在数据块上.
但据我所知,我们公司的某个人最近告诉我相反的情况:根据他的说法,当提交事务时,新数据会立即写入数据块,并且回滚段/撤消表空间保留旧数据UNDO_RETENTION秒的持续时间.在此期间,此旧数据可用于在事务之前在SCN上启动的查询进行访问.
那么,Oracle内部究竟发生了什么,您是否可以提供备份回复的参考?
我们使用的是Oracle 9.2.0.8.
提前致谢.
我正在写一篇关于Guids/UID的人类可读替代品的小文章,例如在TinyURL上用于url哈希的那些(通常在杂志中打印,因此需要简短).
我生成的简单uid是 - 6个字符:小写字母(az)或0-9.
"根据我的计算队长",这是6个相互排斥的事件,虽然计算冲突的概率比P(A或B)= P(A)+ P(B)稍微硬一点,显然它包括数字和来自下面的代码,您可以看到它是否使用50/50的数字或字母.
我对冲突率很感兴趣,如果下面的代码是对生成哈希值的预期冲突率的真实模拟.平均而言,我每百万得到40-50次冲突,但是考虑到uid不会一次产生一百万次,但可能只有每分钟大约10-1000次.
每次冲突的可能性是多少,谁能建议更好的方式呢?
static Random _random = new Random();
public static void main()
{
// Size of the key, 6
HashSet<string> set = new HashSet<string>();
int clashes = 0;
for (int n=0;n < 1000000;n++)
{
StringBuilder builder = new StringBuilder();
for (int i =0;i < 7;i++)
{
if (_random.NextDouble() > 0.5)
{
builder.Append((char)_random.Next(97,123));
}
else
{
builder.Append(_random.Next(0,9).ToString());
}
}
if (set.Contains(builder.ToString()))
{
clashes++;
Console.WriteLine("clash: (" +n+ ")" +builder.ToString());
}
set.Add(builder.ToString());
_random.Next();
//Console.Write(builder.ToString());
}
Console.WriteLine("Clashes: …Run Code Online (Sandbox Code Playgroud) 鉴于此数据集:
ID Name City Birthyear
1 Egon Spengler New York 1957
2 Mac Taylor New York 1955
3 Sarah Connor Los Angeles 1959
4 Jean-Luc Picard La Barre 2305
5 Ellen Ripley Nostromo 2092
6 James T. Kirk Riverside 2233
7 Henry Jones Chicago 1899
Run Code Online (Sandbox Code Playgroud)
我需要找到3个最老的人,但每个城市只有一个.
如果它只是三个最古老的,它将是......
然而,由于Egon Spengler和Mac Taylor都位于纽约,Egon Spengler将退出,而下一个(Sarah Connor /洛杉矶)将会进入.
优雅的解决方案?
更新:
目前PConroy的变体是最好/最快的解决方案:
SELECT P.*, COUNT(*) AS ct
FROM people P
JOIN (SELECT MIN(Birthyear) AS Birthyear
FROM people
GROUP by City) P2 …Run Code Online (Sandbox Code Playgroud) 使用以下代码:
typedef struct
{
char fileName[ 1024];
time_t deleteTime;
} file_item_t;
....
....
setEntry(char *fileName)
{
file_item_t file;
memset( &file, 0x00, sizeof( file_item_t ));
memcpy( file.fileName,
fileName,
sizeof( file.fileName ) - 1 );
...
...
Run Code Online (Sandbox Code Playgroud)
当调用该函数时,它在SPARC机器上运行正常,但运行Solaris 10的i386上的段错误
fileName是一个以字符为终止的字符串,大概有30个字符.看来,试图超越的读取范围内fileName使用memcpy()触发器分割故障在某些系统上.
它是遗留代码,易于纠正.但我想知道的是可能导致这种失败与否的潜在特征.它与堆栈上的读取违规有关吗?有些过境?它与内存分段有关,它只是偶然的一种情况(取决于内存管理和操作系统如何完成内存分段/分页),它可能会失败.
我以为我理解默认方法对哈希的作用...
如果密钥不存在,请为其提供默认值:
irb(main):001:0> a = {}
=> {}
irb(main):002:0> a.default = 4
=> 4
irb(main):003:0> a[8]
=> 4
irb(main):004:0> a[9] += 1
=> 5
irb(main):005:0> a
=> {9=>5}
Run Code Online (Sandbox Code Playgroud)
都好.
但是,如果我设置的默认是一个空列表,或空哈希,我不知道这是在行为都 ....
irb(main):001:0> a = {}
=> {}
irb(main):002:0> a.default = []
=> []
irb(main):003:0> a[8] << 9
=> [9] # great!
irb(main):004:0> a
=> {} # ?! would have expected {8=>[9]}
irb(main):005:0> a[8]
=> [9] # awesome!
irb(main):006:0> a[9]
=> [9] # unawesome! shouldn't this be [] ??
Run Code Online (Sandbox Code Playgroud)
我希望/期待相同的行为,好像我使用了|| …
显然,您可以在for循环中放置变量声明:
for (int i = 0; ...
Run Code Online (Sandbox Code Playgroud)
而且我注意到你可以在if和switch语句中做同样的事情:
if ((int i = f()) != 0) ...
switch (int ch = stream.get()) ...
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在while循环中执行相同的操作时:
while ((int ch = stream.get()) != -1) ...
Run Code Online (Sandbox Code Playgroud)
编译器(VC++ 9.0)根本不喜欢它.
这是合规行为吗?有原因吗?
编辑:我发现我可以这样做:
while (int ch = stream.get() != -1) ...
Run Code Online (Sandbox Code Playgroud)
但由于优先规则,这被解释为:
while (int ch = (stream.get() != -1)) ...
Run Code Online (Sandbox Code Playgroud)
这不是我想要的.
我有一个非常简单的WPF UserControl,如下所示:
namespace MyUserControl
{
/// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
protected override void OnRender(DrawingContext drawingContext)
{
Rect rect = new Rect(RenderSize);
drawingContext.DrawRectangle(Brushes.AliceBlue, new Pen(Brushes.Red, 1), rect);
base.OnRender(drawingContext);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在标准WPF窗口的XAML中使用它,如下所示:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="clr-namespace:MyUserControl;assembly=MyUserControl"
Title="Window1" Height="351" Width="496">
<Grid>
<mc:UserControl1 Margin="0,0,0,0" Name="uControl1" Initialized="uControl1_Initialized"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
使用上面的WPF窗口后面的代码如下所示:
private void uControl1_Initialized(object sender, EventArgs e)
{
MessageBox.Show("Hello!");
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,Initialized事件永远不会被触发.谁能告诉我为什么?
非常感谢!
有什么建议我如何记录我的Perl代码?您使用了什么以及可以使用哪些工具来帮助我?
您使用哪个模块将pod转换为html?
我正在寻找PHP的方法来检测脚本是从shell上的手动调用(我登录并运行它)运行,还是从crontab条目运行.
我有各种用PHP编写的维护类型脚本,我已设置在我的crontab中运行.偶尔,我需要提前手动运行它们,或者如果出现故障/损坏,我需要运行它们几次.
这个问题是我也有一些外部通知设置到任务(发布到Twitter,发送电子邮件等),我不想每次手动运行脚本时发生.
我正在使用php5(如果它很重要),它是一个相当标准的Linux服务器环境.
有任何想法吗?