Oracle在获取最大值时候如何避免脏读?

[复制链接]
查看11 | 回复9 | 2012-10-9 18:08:15 | 显示全部楼层 |阅读模式
如果是sqlServer我们通常是这样处理
SELECT MAX(ID) FROM tableName WITH(XLOCK)
--这里MaxId就是上面得到的
INSERT INTO tableName (ID,Name)
VALUES(MaxId,'张三')
这里是首先读取最大值在加1然后在写入这个表,通常我们是吧这两个脚本放在一个事物里面执行就可以控制到不会读取脏数据.
但是oracle这块如何处理呢?求教

回复

使用道具 举报

千问 | 2012-10-9 18:08:15 | 显示全部楼层
oracle怎么会读取脏数据

你想做什么,sequence可以么
回复

使用道具 举报

千问 | 2012-10-9 18:08:15 | 显示全部楼层
oracle使用sequence.
oracle下你也可以这样.但是并发有点问题.可能获得id会一样.如果id有唯一索引,有一些记录无法插入.


回复

使用道具 举报

千问 | 2012-10-9 18:08:15 | 显示全部楼层
ORACLE允许幻象读和不可重复读,但是不允许脏读
回复

使用道具 举报

千问 | 2012-10-9 18:08:15 | 显示全部楼层
本帖最后由 kswzfc0000469 于 2012-9-26 12:28 编辑
chengxuefei_bj 发表于 2012-9-26 12:19
ORACLE允许幻象读和不可重复读,但是不允许脏读

可以舉例出來什麼時候出現幻讀和不可重複讀 嗎?我之前也看過這句話,一直很糾結。oracle 不是有multi versions嗎
回复

使用道具 举报

千问 | 2012-10-9 18:08:15 | 显示全部楼层
这个应该是用sequence吧
回复

使用道具 举报

千问 | 2012-10-9 18:08:15 | 显示全部楼层
这里主要是想可否解决
当用户读取到最大ID值之后,在接下来的写入数据这个过程中不会出现另一个用户也同时做这样的事情导致数据的ID重复.
当然可以通过设置不允许重复来进行控制,但是是否可以如sqlServer锁表的方式控制下
回复

使用道具 举报

千问 | 2012-10-9 18:08:15 | 显示全部楼层
lock table table_name in share mode,或更大的鎖
回复

使用道具 举报

千问 | 2012-10-9 18:08:15 | 显示全部楼层
楼主先学会问问题,
回复

使用道具 举报

千问 | 2012-10-9 18:08:15 | 显示全部楼层
kswzfc0000469 发表于 2012-9-26 12:27
可以舉例出來什麼時候出現幻讀和不可重複讀 嗎?我之前也看過這句話,一直很糾結。oracle 不是有multi...

幻象读就是你指定一个条件返回一个结果集,这时候别人插入一条数据满足你查询的条件,你再次查询得到别人新插入的行,这新行就称为幻象;
不可重复读是你指定一个条件返回一个结果集,别人修改了满足你查询条件结果集的数据,当你再次查询的时候,发现结果集变了,这种现象称为不可重复读
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行