[#0x0034] Isolation

  参考Wikipedia: http://en.wikipedia.org/wiki/Isolation_(database_systems)#Repeatable_reads_.28phantom_reads.29  

 

  Isolation的理想状态是:the result of Transaction A is invisible to Transaction B until Transaction A is completed。不过这么一来,只有Serializable级别才能满足要求,即Transactions是一个接一个地执行,不允许Transactions的并行。如果想要Transactions的并行,那么就不可能有绝对的isolation。为此,ANSI/ISO制定的SQL标准给Isolation分了4个级别,由高到低分别是:

  • Serializable
  • Repeatable Read (Phantom Read)
  • Read Committed (Nonrepeatable Read)
  • Read Uncommitted (Dirty Read)

级别越高的,isolation性越好,而低级别的isolation会有各种各样的并发问题(如上面括号中所示)。下面一一介绍。

 

1. Read Uncommitted

  Transaction 1可以查看Transaction 2未提交的操作结果,这会导致Dirty Read的问题,如下图所示:

 

dirty read

Transaction 1的执行的第二个query会读到Transaction 2中update的结果,如果Transaction 2 rollback的话,这个读到的数据明显是错误的。

 

2. Read Committed

  如果我们强制Transaction 1只能读Transaction 2中已经commit的update,就可以解决Dirty Read的问题。强制的手段是:每次query(比如SELECT)时,都会获取当前数据库(或者可能只是query涉及的表)的一个snapshot,query从这个snapshot中获得结果。没有commit的update不会在snapshot中出现,所以就不会被query到。

  这样允许Transaction 2并行执行,且不会影响Transaction 1。当Transaction 1 commit的时候,DBMS检测是否有冲突(比如Transaction 1也update了Transaction 2中update的row),如果执行的结果等同于顺序执行Transaction 1和 Transaction 2 ,则认为没有冲突。

  但这样也会有问题:Nonrepeatable Read,即可能执行同一query两次而出现不同的结果,我们认为这是不符合一致性原则的。

nonrepeatable read

 

3. Repeatable Read

  解决Nonrepeatable Read问题的办法是给Transaction 1中的SELECT涉及的行加一个read lock。

  锁的排斥功能很明确:read locks不会block read locks,只block write locks;write locks block both read locks and write locks。

  不过会有新的问题:phantom read。

 

phantom read

 

当Transaction 1执行一个range query(范围查询,如like, between等)时,只会为涉及到的row加read lock,如果插入一个新row在range之内,第二次range query还是会被读出。

 

4. Serializable

  强制Transactions按顺序执行,所以Transaction之间不可能冲突。强制的手段是给place a read lock on every row the transaction read;同时,如果有range query,还会添加一个range lock。明显,Serializable会耗费很多的lock overhead。

  Serializable相当于在Transaction 1开始时(而不是query开始时)给当前数据库(或是Transaction涉及的表)take a snapshot,Transaction 1中的所有query都从这一个snapshot中获取结果。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Isolation Forest是一种异常检测算法,可用于识别数据集中的异常值。Sklearn是一个Python机器学习库,提供了Isolation Forest算法的实现。 Isolation Forest基于以下两个概念来检测异常值:孤立实例和孤立树。孤立实例是数据集中的少数异常点,而孤立树是通过随机选择和分割特征来建立的二叉树。算法通过计算数据实例在树中的深度来评估其异常程度。异常点被认为是通过较少的路径被孤立,而正常点通常需要更多的路径来被孤立。 使用sklearn库中的Isolation Forest算法,我们可以按照以下步骤来进行异常检测。 首先,导入必要的库和数据集。使用sklearn.ensemble模块中的IsolationForest类来创建模型。 ``` import numpy as np from sklearn.ensemble import IsolationForest # 创建模型 model = IsolationForest(n_estimators=100, contamination=0.05, random_state=42) ``` 然后,我们可以使用模型的fit()方法来训练 Isolation Forest模型。 ``` # 训练模型 model.fit(data) ``` 在训练完成后,我们可以使用predict()方法来预测数据中的异常值。预测结果是-1表示异常值,1表示正常值。 ``` # 预测异常值 predictions = model.predict(data) ``` 最后,我们可以根据预测结果来标记和分析数据中的异常值。 需要注意的是,在使用Isolation Forest算法时,需要调整一些重要参数。例如,n_estimators参数表示建立孤立树的数量,contamination参数表示数据集中异常值的比例,我们可能需要根据实际情况进行调整。 总的来说,通过使用sklearn中的Isolation Forest算法,我们可以简单方便地进行异常检测,对于发现数据集中的异常值具有较好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值