`

数据库事务 (二)事务隔离

阅读更多
数据库的事务隔离级别

在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别-Transaction Isolation Level

解决方案:

未授权读取 (Read Uncommitted):允许脏读取,但不允许更新丢失。 如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,单允许其他事务读此行数据。 该隔离级别可以通过“排他写锁”实现。




授权读取 (Read Committed): 允许不可重复读取,单不允许脏读取。 这可以通过“瞬间共享读锁”和“排他写锁”实现。  读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问改行。

在Oracle官方文档Oracle Concept 11gR2里面讲到Read Committed:
In the read committed isolation level, which is the default, every query executed by a transaction sees only data committed before the query-not the transaction-began. This level of isolation is appropriate for database environments in which few transactions are likely to conflict. A query in a read committed transaction avoids reading data that commits while the query is in progress.
For example, if a query is halfway through a scan of a million-row table, and if a different transaction commits an update to row 950,000, then the query does not see this change when it reads row 950,000. However, because the database does not prevent other transactions from modifying data read by a query, other transactions may change data between query executions. Thus, a transaction that runs the same query twice may experience fuzzy reads and phantoms.
这里有两个重点:
1. ORACLE DBMS的默认事务隔离级别正式Read Committed.
Read committed
This is the default transaction isolation level. Each query executed by a transaction sees only data that was committed before the query (not the transaction) began. An Oracle query never reads dirty (uncommitted) data.
Oracle的请求从来不读取脏数据

2. Read Committed可能会出现幻读。


可重复读取(Repeatable Read): 禁止不可重复读取和脏读取, 到那时有事可能出现幻影数据。 这可以通过“共享读锁”和“排他写锁”实现。 读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

序列化(Serializable): 提供严格的事务隔离。 它要求事务序列化执行, 事务只能一个接一个的执行, 但不能并行。 如果仅仅通过”行级锁“是无法实现事务序列化的, 必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

图1






设定隔离级别的原则
1. 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
2. 对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能避免脏读,而且有较好的并发性能。 尽管它会导致不可重复读,虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。


在Hibernate中设置隔离级别

在Hibernate的配置文件中可以显式的设置隔离级别。每一种隔离级别都对应一个整数。

-1 : Read Uncommited
-2 :  Read Committed
-4 :  Repeatable Read
-8 :  Serializable

例如,以下代码把hibernate.cfg.xml文件中的隔离级别设为Read Committed:
    hibernate.connection.isolation=2
对于从数据库连接池中获得的每个连接,Hibernate都会把它改为使用Read Committed隔离级别。












======================================
关于各种读
虚读 phantom read:
转自维基: [url]http://en.wikipedia.org/wiki/Isolation_%28database_systems%29#Phantom_reads
[/url]
A phantom read occurs when, in the course of a transaction, two identical queries are executed, and the collection of rows returned by the second query is different from the first.
This can occur when range locks are not acquired on performing a SELECT... WHERE operation. The phantom reads anomaly is a special case of Non-repeatable reads when Transaction 1 repeats a ranged SELECT...WHERE query and ,between both operations, Transaction 2 creates (i.e. INSERT) new rows (in the target table) which fulfill that WHERE clause.

Transaction 1 Transaction 2
/* Query 1 */
SELECT * FROM users
WHERE age BETWEEN 10 AND 30;
/* Query 2 */
INSERT INTO users VALUES ( 3, 'Bob', 27 );
COMMIT;
/* Query 1 */
SELECT * FROM users
WHERE age BETWEEN 10 AND 30;

Note that Transaction 1 executed the same query twice. If the highest level of isolation were maintained, the same set of rows should be returned both times, and indeed that is what is mandated to occur in a database operation at the SQL SERIALIZABLE isolation level. However, at the lesser isolation levels, a different set of rows may be returned the second time.

In the SERIALIZABLE isolation mode, Query 1 would result in all records with age in the range 10 to 30 being locked, thus Query 2 would block until the first transaction was commited. In REPEATABLE READ mode, the range would not be locked, allowing the record to be inserted and the second execution of Query 1 to include the new row in its results.

最后这一段这里讲到了Seriliazable模式和Reapeatable-read模式。 前者通过锁住T1所读取的信息,一直到提交事务,也就是后面那个SELECT被执行以后。 这段事件里这个10到30岁的范围的数据一直处于被锁状态,因此T2就会被阻塞(block),直到T1被提交。
而Repeatable-read模式不会对对象信息加锁,因此T1在第二次执行SELECT语句时,会查到T2插入的新的数据。
这也就如图1所示,隔离级别Serializable可以防止虚读(幻读),而Repeatable Read不可以。 但是就并发性能来说,Serializable是最差的,从上面的例子就可以看出,T2会一直等待T1释放资源。



如果符合搜索条件的一行数据在后面的读取操作中出现,但该行数据却不属于最初的数据,就会发生这种事件。

用Oracle进行试验如下:
t1: select * from test where id = 1 for update;
t1: update test set id = 3 where id =1 ;
t2: select * from test where id = 1;
t1: commit;
t2: select * from test where id  =1;
这里t2的第一次select语句可以查到数据,因为此时t1的事务还没提交。
第二次就查不到了, 此时t1事务已经提交,该row数据已经被修改。
  • 大小: 40.5 KB
  • 大小: 81.7 KB
分享到:
评论

相关推荐

    数据库事务隔离级别

    介绍数据库事务的四种隔离级别,比较不同隔离级别的区别和影响

    数据库事务和隔离级别

    数据库事务和隔离级别

    数据库事务总结 数据库事务总结

    ### 数据库事务总结 #### 一、事务的基本概念与特性 **事务**是数据库系统中的一个逻辑工作单元,它由一系列的操作组成,这些操作要么都完成,要么都不完成,以此来保证数据的一致性和完整性。 #### 二、事务的...

    数据库事务与隔离技术

    数据库事务是确保数据库操作一致性的重要机制,它定义了一组数据库操作的边界,这些操作要么全部执行,要么全部不执行。事务通常包含四个基本属性,即原子性(Atomicity)、一致性(Consistency)、隔离性...

    数据库事务与隔离级别.docx

    数据库事务与隔离级别 数据库事务是指一系列操作的集合,作为一个单元执行,以维护数据库的一致性和完整性。事务必须具备四大特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性...

    C#数据库事务原理及实践

    SQL Server 2000 提供了多种事务隔离级别,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable),根据需求选择合适的隔离级别。 持久性意味着一旦...

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

    事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...

    数据库事务处理ppt

    数据库事务处理是数据库管理系统中的核心概念,用于确保数据的一致性和完整性。事务是数据库操作的基本单元,它包含一组逻辑操作,这些操作要么全部执行,要么全部不执行,以确保数据的原子性。事务处理主要关注两个...

    spring常用数据库事务传播属性和事务隔离级别1

    Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...

    redis事务与关系型数据库事务比较

    【Redis 事务与关系型数据库事务的比较】 Redis 和关系型数据库(如 MySQL)在事务处理上有显著的差异。在Redis中,事务提供了一种批量执行命令的方式,以确保原子性,但其机制与传统的ACID(原子性、一致性、隔离...

    sql数据库事务机制详解

    ### SQL数据库事务机制详解 #### 事务的基本概念 在数据库管理中,事务是一个非常重要的概念。事务是指作为单个逻辑工作单元执行的一系列操作。它主要用于确保数据在更新过程中的完整性,特别是在同步发生的多步...

    MY SQL 事务隔离 查询:默认事务隔离级别

    事务隔离 查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务...

    数据库事务隔离级别.docx

    #### 二、事务隔离级别的定义与作用 事务隔离级别是指数据库系统为每个事务提供的一种环境,以确保事务在执行过程中不受其他事务的影响,并能够正确地与其他事务交互。它通过不同的技术手段(如锁机制)来实现对事务...

    数据库 事务

    数据库事务是数据库操作的核心概念,它是数据库管理系统执行过程中的一个逻辑工作单位,包含了对数据库的一系列操作。在数据库系统中,事务确保数据的一致性和完整性,使得即使在系统出现故障或者并发操作的情况下,...

    Spring Boot数据库事务控制.zip

    5. **事务隔离级别**:Spring支持数据库的四种标准隔离级别,即READ_UNCOMMITTED(读未提交)、READ_COMMITTED(读已提交)、REPEATABLE_READ(可重复读)和SERIALIZABLE(串行化)。不同的隔离级别对应不同的并发...

    数据库事务应用

    ### 数据库事务应用详解 #### 事务处理的重要性与ACID特性 事务处理是现代数据库管理系统(DBMS)中不可或缺的一部分,尤其对于那些涉及复杂业务逻辑、需要确保数据一致性和完整性的应用来说更是如此。事务处理的...

    分布式数据库事务处理(COM+实现)

    分布式数据库事务处理是数据库系统中的一个重要概念,尤其是在大型企业级应用和互联网服务中,它能够保证数据的一致性和完整性,即使在多台计算机之间进行数据操作。COM+(Component Object Model Plus)是微软提出...

    数据库事务的隔离级别1

    数据库事务的隔离级别是数据库管理系统在并发环境中保证数据一致性、避免脏读、不可重复读和幻读等问题的关键机制。在数据库领域,ACID(原子性、一致性、隔离性、持久性)理论是事务处理的基本原则。 1. **原子性...

Global site tag (gtag.js) - Google Analytics