`
syc8616
  • 浏览: 9428 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

isolation level

阅读更多

隔离级别(isolation level

 

l         隔离级别定义了事务与事务之间的隔离程度。

l         隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。

l         ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别:

l          未提交读(read uncommitted

l          提交读(read committed

l          重复读(repeatable read

l          序列化(serializable

 

数据操作经常出现的现象:

脏读:当一个事务读取另一个事务未提交的修改时,产生脏读;

非重复读:同一查询在同一事务中多次进行,由于其他事务所作的修改或删除操作,每次返回不同的结果集,此时发生非重复读(A transaction rereads data it has previously read and finds that another committed transaction has modified or deleted the data.  )。

幻读:同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additional rows that satisfy the condition.  )

下面是隔离级别及其对应的可能出现或不可能出现的现象

 

ORACLE的隔离级别

 

l         ORACLE提供了SQL92标准中的read committedserializable,同时提供了非SQL92标准的read-only

l          read committed

l         这是ORACLE缺省的事务隔离级别。

l         事务中的每一条语句都遵从语句级的读一致性。

l         保证不会脏读;但可能出现非重复读和幻像。

l          serializable

l         简单地说,serializable就是使事务看起来象是一个接着一个地顺序地执行。

l         仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改。

l         保证不会出现非重复读和幻像。

l         Serializable隔离级别提供了read-only事务所提供的读一致性(事务级的读一致性),同时又允许DML操作。

l         如果有在serializable事务开始时未提交的事务在serializable事务结束之前修改了serializable事务将要修改的行并进行了提交,则serializable事务不会读到这些变更,因此发生无法序列化访问的错误。(换一种解释方法:只要在serializable事务开始到结束之间有其他事务对serializable事务要修改的东西进行了修改并提交了修改,则发生无法序列化访问的错误。)

l         If a serializable transaction contains data manipulation language (DML) that attempts to update any resource that may have been updated in a transaction uncommitted at the start of the serializable transaction, (并且修改在后来被提交而没有回滚),then the DML statement fails. 返回的错误是ORA-08177: Cannot serialize access for this transaction

l         ORACLE在数据块中记录最近对数据行执行修改操作的N个事务的信息,目的是确定是否有在本事务开始时未提交的事务修改了本事务将要修改的行。具体见英文:Oracle permits a serializable transaction to modify a data row only if it can determine that prior changes to the row were made by transactions that had committed when the serializable transaction began. To make this determination efficiently, Oracle uses control information stored in the data block that indicates which rows in the block contain committed and uncommitted changes. In a sense, the block contains a recent history of transactions that affected each row in the block. The amount of history that is retained is controlled by the INITRANS parameter of CREATE TABLE and ALTER TABLE. Under some circumstances, Oracle may have insufficient history information to determine whether a row has been updated by a "too recent" transaction. This can occur when many transactions concurrently modify the same data block, or do so in a very short period. You can avoid this situation by setting higher values of INITRANS for tables that will experience many transactions updating the same blocks. Doing so will enable Oracle to allocate sufficient storage in each block to record the history of recent transactions that accessed the block.

l          The INITRANS ParameterOracle stores control information in each data block to manage access by concurrent transactions. Therefore, if you set the transaction isolation level to serializable, you must use the ALTER TABLE command to set INITRANS to at least 3. This parameter will cause Oracle to allocate sufficient storage in each block to record the history of recent transactions that accessed the block. Higher values should be used for tables that will undergo many transactions updating the same blocks.

l          read-only

l         遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的更改。

l         不允许在本事务中进行DML操作。

l         read onlyserializable的子集。它们都避免了非重复读和幻像。区别是在read only中是只读;而在serializable中可以进行DML操作。

l         Export with CONSISTENT = Y sets the transaction to read-only.

l          read committedserializable的区别和联系:

l         事务1先于事务2开始,并保持未提交状态。事务2想要修改正被事务1修改的行。事务2等待。如果事务1回滚,则事务2(不论是read committed还是serializable方式)进行它想要做的修改。如果事务1提交,则当事务2read committed方式时,进行它想要做的修改;当事务2serializable方式时,失败并报错“Cannot serialize access”,因为事务2看不见事务1提交的修改,且事务2想在事务一修改的基础上再做修改。具体见英文:Both read committed and serializable transactions use row-level locking, and both will wait if they try to change a row updated by an uncommitted concurrent transaction. The second transaction that tries to update a given row waits for the other transaction to commit or roll back and release its lock. If that other transaction rolls back, the waiting transaction (regardless of its isolation mode) can proceed to change the previously locked row, as if the other transaction had not existed. However, if the other (blocking) transaction commits and releases its locks, a read committed transaction proceeds with its intended update. A serializable transaction, however, fails with the error "Cannot serialize access", because the other transaction has committed a change that was made since the serializable transaction began.

l         read committedserializable可以在ORACLE并行服务器中使用。

l          关于SET TRANSACTION READ WRITEread writeread committed 应该是一样的。在读方面,它们都避免了脏读,但都无法实现重复读。虽然没有文档说明read write在写方面与read committed一致,但显然它在写的时候会加排他锁以避免更新丢失。在加锁的过程中,如果遇到待锁定资源无法锁定,应该是等待而不是放弃。这与read committed一致。

l         语句级的读一致性

l          ORACLE保证语句级的读一致性,即一个语句所处理的数据集是在单一时间点上的数据集,这个时间点是这个语句开始的时间。

l          一个语句看不见在它开始执行后提交的修改。

l          对于DML语句,它看不见由自己所做的修改,即DML语句看见的是它本身开始执行以前存在的数据。

l         事务级的读一致性

l          事务级的读一致性保证了可重复读,并保证不会出现幻像。

l         设置隔离级别

l          设置一个事务的隔离级别

l         SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

l         SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

l         SET TRANSACTION READ ONLY;

l         设置增个会话的隔离级别

l         ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;

l         ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;

分享到:
评论

相关推荐

    TRANSACTION ISOLATION LEVEL

    RANSACTION ISOLATION LEVEL

    微软内部资料-SQL性能优化3

    To make use of either more or less strict isolation levels in applications, locking can be customized for an entire session by setting the isolation level of the session with the SET TRANSACTION ...

    oracle lock and isolation at

    在Oracle中,锁(Lock)和隔离级别(Isolation Level)是确保多用户环境下数据一致性和完整性的关键组成部分。本篇文章将深入探讨这两个概念及其在实际应用中的重要性。 一、Oracle锁机制 1. **锁定类型**: - **...

    历史上最强的sql FAQ for Oracle

    第一部分、SQL&PL/SQL [Q]怎么样查询特殊字符,如通配符%与_ ...[A]set transaction [isolation level] read committed; 默认语句级一致性 set transaction [isolation level] serializable; read only; 事务级一致性

    C#自己实现AOP的事务操作

    public IsolationLevel IsolationLevel { get; set; } = IsolationLevel.ReadCommitted; public bool IsReadOnly { get; set; } public void ExecuteWithTransaction(Func<bool> action) { using (var ...

    MySQL加锁处理分析@何登成1

    本文将从 MVCC 机制出发,讨论 Snapshot Read 和 Current Read 两种读取方式的区别,然后深入分析 MySQL 加锁机制的实现细节,包括 Cluster Index、2PL、Isolation Level 等方面。最后,本文还将对死锁原理和分析...

    Analog Device的AD集成封装库intlib

    Interface and Isolation Level Translators Interface and Isolation Protection Products Power Management Linear Regulators Power Management Multi-Output Regulators Switches and Multiplexers Analog Cross...

    BtuDatabaseControl组件使用说明

    * 执行返回 DataSet 对象的带参数的命令(事务模式):BtuDatabaseControl.DBLayerHelp.ExecuteDataSet(string, System.Data.CommandType, System.Data.Common.DbParameter[], System.Data.IsolationLevel) ...

    nh3连接sqlite或sqlserver

    db.IsolationLevel = IsolationLevel.ReadCommitted; }); var sessionFactory = configuration.BuildSessionFactory(); ``` SQL Server连接: 对于SQL Server,需要安装Microsoft SQL Server的ADO.NET驱动(如...

    事务及其并发控制实验1

    显式事务可以提供更多的控制权,例如可以指定事务的名称、 isolation level等。 6. 事务的 isolation level 事务的隔离级别(Isolation Level)决定了事务执行过程中的并发控制机制。常见的隔离级别包括Read ...

    【ASP.NET编程知识】.net core 基于Hangfire+Mysql持久化实现定时任务配置方法.docx

    TransactionIsolationLevel = (IsolationLevel?)System.Data.IsolationLevel.ReadCommitted, QueuePollInterval = TimeSpan.FromSeconds(15), JobExpirationCheckInterval = TimeSpan.FromHours(1), ...

    事务四大隔离级别的不同

    在MySQL中,可以通过`SET TRANSACTION ISOLATION LEVEL`语句来改变当前会话的事务隔离级别。例如,要设置为读已提交,可以执行: ```sql SET TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` 而要恢复到默认的可...

    mysql修改数据刷新页面直接显示

    mysql> set global transaction isolation level read committed; Query OK, 0 rows affected (0.00 sec) mysql> set session transaction isolation level read committed; Query OK, 0 rows affected (0.00 sec) ...

    oracle 事务实验

    SET TRANSACTION [ISOLATION LEVEL level] [READ ONLY | READ WRITE]; ``` - **示例**: - 设置事务为只读: ```sql SQL> set transaction readonly; ``` - 设置事务为读写,默认情况: ```sql SQL> set ...

    52 MySQL是如何支持4种事务隔离级别的?Spring事务注解是如何设置的?l.pdf

    总之,MySQL 的事务隔离机制允许用户根据需要选择合适级别的隔离,同时提供了 `SET TRANSACTION ISOLATION LEVEL` 命令和 Spring 的 `@Transactional` 注解来灵活配置,以保证数据的一致性和应用的性能。对于开发者...

    前端-后端java的Util类的工具类

    │ Level.java │ Logging.java │ LoggingMXBean.java │ LoggingPermission.java │ LogManager.java │ LogRecord.java │ LogUtil.java │ LogUtil2.java │ MemoryHandler.java │ PropertiesFactory.java │ ...

    MySQL数据库:事务隔离级别.pptx

    SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED 说明:如果指定GLOBAL,那么定义的隔离级将适用于所有的SQL用户;如果指定SESSION,则...

    Oracle中使用锁进行并发控制

    在Oracle中,可以使用`SET TRANSACTION ISOLATION LEVEL`语句来显式地设置事务的隔离级别。例如: ```sql SET TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` 或者在会话级别设置: ```sql ALTER SESSION SET ...

Global site tag (gtag.js) - Google Analytics