查看: 7862|回复: 25

[讨论] 对SERIALIZABLE隔离级别的反思

[复制链接]
论坛徽章:
5
慢羊羊
日期:2015-03-04 14:55:272015年新春福章
日期:2015-03-06 11:59:47喜羊羊
日期:2015-04-02 19:59:02懒羊羊
日期:2015-05-17 21:03:29懒羊羊
日期:2015-05-20 20:04:36
跳转到指定楼层
1#
发表于 2015-3-24 11:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 komicakomica 于 2015-3-24 11:21 编辑

http://www.nocoug.org/Journal/NoCOUG_Journal_200511.pdf#page=8中的Concurrency—There’s No Free Lunch这篇文章
https://iggyfernandez.wordpress.com/2010/09/20/dba-101-what-does-serializable-really-mean/


讨论oracle对serializable的实现和SQL标准之间的分歧。


论坛徽章:
5
慢羊羊
日期:2015-03-04 14:55:272015年新春福章
日期:2015-03-06 11:59:47喜羊羊
日期:2015-04-02 19:59:02懒羊羊
日期:2015-05-17 21:03:29懒羊羊
日期:2015-05-20 20:04:36
2#
 楼主| 发表于 2015-3-24 16:52 | 只看该作者

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
3#
发表于 2015-3-25 03:53 | 只看该作者
在实际应用中我还没碰到过READ COMMITTED之外的需求。楼主如果有实例可以拿出来共享一下。

使用道具 举报

回复
论坛徽章:
5
慢羊羊
日期:2015-03-04 14:55:272015年新春福章
日期:2015-03-06 11:59:47喜羊羊
日期:2015-04-02 19:59:02懒羊羊
日期:2015-05-17 21:03:29懒羊羊
日期:2015-05-20 20:04:36
4#
 楼主| 发表于 2015-3-25 09:02 | 只看该作者
newkid 发表于 2015-3-25 03:53
在实际应用中我还没碰到过READ COMMITTED之外的需求。楼主如果有实例可以拿出来共享一下。

http://www.cnblogs.com/1-2-3/arc ... evel-ora-08177.html
搜索“严格依赖时间的程序”,一个费用结算的示例。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
5#
发表于 2015-3-25 09:06 | 只看该作者
komicakomica 发表于 2015-3-25 09:02
http://www.cnblogs.com/1-2-3/archive/2012/04/05/oracle-isolation-level-ora-08177.html
搜索“严格依 ...

碰到这种需求我一律串行化处理。因为只有同一个账户才会被阻塞,实用上并不会有问题。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
6#
发表于 2015-3-25 09:11 | 只看该作者
komicakomica 发表于 2015-3-25 09:02
http://www.cnblogs.com/1-2-3/archive/2012/04/05/oracle-isolation-level-ora-08177.html
搜索“严格依 ...

太长没仔细看,但是“如何避免幻读产生的问题”这个例子,应该用先UPDATE并且RETURNING INTO, 然后再INSERT的办法,而不是文中那种方法。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
7#
发表于 2015-3-25 09:13 | 只看该作者
komicakomica 发表于 2015-3-25 09:02
http://www.cnblogs.com/1-2-3/archive/2012/04/05/oracle-isolation-level-ora-08177.html
搜索“严格依 ...

“严格依赖时间的程序”这个例子,TOM的书中是有提到的,关于用时间戳进行数据抽取如何不遗漏的问题。他用的方法是访问V$TRANSACTION。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
8#
发表于 2015-3-25 09:17 | 只看该作者
书摘:TOM的“Oracle 9i10g编程艺术”
7.3.1 一种会失败的常用数据仓库技术
我看到,许多人都喜欢用这样一种常用的数据仓库技术:
(1) 他们使用一个触发器维护源表中的一个LAST_UPDATED 列,这与上一章的6.2.3 节中讨论的
方法很相似。
(2) 最初要填充数据仓库表时,他们要记住当前的时间,为此会选择源系统上的SYSDATE。例
如,假设现在刚好是上午9:00。
(3) 然后他们从事务系统中拉(pull)出所有行,这是一个完整的SELECT * FROM TABLE 查询,
可以得到最初填充的数据仓库。
(4) 要刷新这个数据仓库,他们要再次记住现在的时间。例如,假设已经过去了1 个小时,现
在源系统上的时间就是10:00.他们会记住这一点。然后拉出自上午9:00(也就是第一次拉出
数据之前的那个时刻)以来修改过的所有记录,并把这些修改合并到数据仓库中。
注意这种技术可能会在两次连续的刷新中将相同的记录“拉出”两次。由于时钟的粒度所致,这是不可
避免的。MERGE 操作不会受此影响(即更新数据仓库中现有的记录,或插入一个新记录)。
他们相信,现在数据仓库中有了自第一次执行拉出操作以来所修改的所有记录。他们确实可能有所
有记录,但是也有可能不是这样。对于其他采用锁定系统的数据库来说,这种技术确实能很好地工作,在
这些数据库中读会被写阻塞,反之写也会被读阻塞。但是在默认支持非阻塞读的系统中,这个逻辑是有问
题的。
要看这个例子有什么问题,只需假设上午9:00 至少有一个打开的未提交事务。例如,假设在上午
8:59:30 时,这个事务已经更新了表中我们想复制的一行。在上午9:00, 开始拉数据时,会读取这个表中
的数据,但是我们看不到对这一行做的修改;只能看到它的最后一个已提交的版本。如果在查询中到达这
一行时它已经锁定,我们就会绕过这个锁。如果在到达它之前事务已经提交,我们还是会绕过它读取查询
开始时的数据,因为读一致性只允许我们读取语句开始时数据库中已经提交的数据。在上午9:00 第一次
拉数据期间我们读不到这一行的新版本,在上午10:00 刷新期间也读不到这个修改过的行。为什么呢?上
午10:00 的刷新只会拉出自那天早上上午9:00 以后修改的记录,但是这个记录是在上午8:59:30 时修改的,
我们永远也拉不到这个已修改的记录。
在许多其他的数据库中,其中读会被写阻塞,可以完成已提交但不一致的读,那么这个刷新过程就能
很好地工作。如果上午9:00(第一次拉数据时)我们到达这一行,它已经上锁,我们就会阻塞,等待这一
行可用,然后读取已提交的版本。如果这一行未锁定,那么只需读取就行,因为它们都是已提交的。
那么,这是否意味着前面的逻辑就根本不能用呢?也不是,这只是说明我们需要用稍微不同的方式来
得到“现在”的时间。应该查询V$TRANSACTION,找出最早的当前时间是什么,以及这个视图中START_TIME
列记录的时间。我们需要拉出自最老事务开始时间(如果没有活动事务,则取当前的SYSDATE 值)以来经
过修改的所有记录:
select nvl( min(to_date(start_time,'mm/dd/rr hh24:mi:ss')),sysdate)
from v$transaction;
在这个例子中,这就是上午8:59:30,即修改这一行的事务开始的那个时间。我们在上午10:00 刷新
数据时,会拉出自那个时间以来发生的所有修改,把这些修改合并到数据仓库中,这就能得到需要的所有
东西。

使用道具 举报

回复
论坛徽章:
5
慢羊羊
日期:2015-03-04 14:55:272015年新春福章
日期:2015-03-06 11:59:47喜羊羊
日期:2015-04-02 19:59:02懒羊羊
日期:2015-05-17 21:03:29懒羊羊
日期:2015-05-20 20:04:36
9#
 楼主| 发表于 2015-3-25 09:20 | 只看该作者
newkid 发表于 2015-3-25 09:06
碰到这种需求我一律串行化处理。因为只有同一个账户才会被阻塞,实用上并不会有问题。

并不总是这么容易处理,如果是修改记录的普通用户和执行统计的管理员用户之间的冲突该怎么办。
The Case of the Dangling DBA

使用道具 举报

回复
论坛徽章:
5
慢羊羊
日期:2015-03-04 14:55:272015年新春福章
日期:2015-03-06 11:59:47喜羊羊
日期:2015-04-02 19:59:02懒羊羊
日期:2015-05-17 21:03:29懒羊羊
日期:2015-05-20 20:04:36
10#
 楼主| 发表于 2015-3-25 09:30 | 只看该作者
newkid 发表于 2015-3-25 09:17
书摘:TOM的“Oracle 9i10g编程艺术”
7.3.1 一种会失败的常用数据仓库技术
我看到,许多人都喜欢用这样一 ...

这样的应用写起来就不那么方便了。

应该说纯靠MVCC的方式是不能实现ANSI-SQL标准要求的serializable隔离级别,必须辅以select ... for update甚至lock table之类的手段。PostgreSQL里面的最高隔离级别SSI是靠加入额外的读写依赖检查,见http://blog.chinaunix.net/uid-20726500-id-3900541.html

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表