假如有两个事务并发,顺序如下:
那么在事务A中,query1跟query2查询出来的结果是否一样呢?这就跟事务隔离级别有关了。
SQL的标准定义里面,一共有四种级别:
1. read uncommited :读取未提交的数据.就是其他事务已经修改但还未commit的.
2. read commited :读取已提交的数据query2会跟query1读取的数据不一样.
3. repeatable read :可重复读取,即query1跟query2读取的数据是一样的.
4. serializable :序列化.
SQL 标准用三个必须在并行的事务之间避免的现象定义了四个级别的事务隔离。
这些不希望发生的现象是:
1. 脏读(dirty reads):一个事务读取了被另一个事务改写但还没提交的数据.
2. 不可重复读(non-repeatable reads):一个事务重新读取前面读取过的数据, 发现该数据已经被另一个已提交的事务修改过(一个事务执行相同的查询两次或两次以上,但每次查询结果都不同时。这由于另一个并发事务在两次查询之间更新(update)了数据).
3. 幻读(phantom read):在两次查询同一时间点数据时,发现数据数量发生改变。(当一个事务读取几行记录后,另一个并发事务插入(insert,delete)一些记录).
SQLServer
我们首先在SQLServer上做了实验,SQLServer一共支持四种隔离级别,read uncommited跟read commited我们没有实验,我们直接先实验repeatable read.
如果事务A定义了如下级别,那么当事务B执行到modify1这条语句时,如果modify1是update的话,就被锁起来,一直等到事务A提交完以后,锁才会被释放。
而如果是insert的话,则可以顺利进行下去,然后在事务A中,query2查到的数据,是已经被事务B修改过的数据。(发生了幻读)
如果将级别定义在serializable的话,则在modify1语句中,update,insert或者delete都会被锁掉。也就是说,SQLServer对这些级别的支持,是通过锁来做到的,虽然可以保证事务正常进行,但是并行的性能却很差。
Oracle
oracle只支持两个级别,read commited跟serializable,实验的结果是,oracle的serializable是通过版本控制来完成的,而不是通过锁机制,这就保证了并行的性能。Oracle的
默认级别是read commited.
Mysql
MySQL也支持四个级别,而且MySQL也是通过版本控制而非锁机制来完成的。
假如有两个事务并发,顺序如下:
MySQL默认使用的是REPEATABLE READ .Transaction A 的 第 1,2,3次query都是一样的。(query3好像没有发生幻读,不知道什么原因,研究中),只有第query4才显示Transaction B刚刚insert的数据Transaction A query3的时候可以通过SELECT * FROM t LOCK IN SHARE MODE; 来获取Transaction B刚刚insert并且commit的数据。但是如果Transaction B一直没有commit,query3会持续等待,不能读取。
相关推荐
介绍数据库事务的四种隔离级别,比较不同隔离级别的区别和影响
数据库事务和隔离级别
查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务隔离级别
数据库事务隔离级别是确保数据一致性和完整性的重要机制。通过合理设置事务隔离级别,可以在保证数据一致性的同时,优化数据库的并发性能。开发者需要根据具体的应用场景和业务需求,选择最合适的事务隔离级别,并在...
事务隔离级别是数据库系统用来解决并发问题,保证数据正确性的一种策略。MySQL数据库提供了四种不同的事务隔离级别,它们分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable ...
翻译的 数据库与事务处理-带书签pdf完整版本,非PPT
MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...
数据库事务与隔离级别 数据库事务是指一系列操作的集合,作为一个单元执行,以维护数据库的一致性和完整性。事务必须具备四大特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性...
事务隔离级别是指数据库事务的隔离级别,用于控制事务之间的隔离度。Java 中有五种事务隔离级别,分别是: 1. ISOLATION_DEFAULT:这是 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别...
4. 事务处理:商品交易涉及多个操作,如减库存、更新交易状态、扣款等,这些操作必须在原子性、一致性、隔离性和持久性的ACID原则下完成。因此,系统需要支持数据库事务,确保交易的完整性。 5. 安全性:保护用户...
疫情隔离-疫情隔离系统-疫情隔离系统源码-疫情隔离管理系统-疫情隔离管理系统java代码-疫情隔离系统设计与实现-基于springboot的疫情隔离系统-基于Web的疫情隔离系统设计与实现-疫情隔离网站-疫情隔离网站代码-疫情...
- **定义**:使用数据库默认的事务隔离级别。 - **应用场景**:适用于大多数情况下的数据库操作,保持默认设置。 2. **ISOLATION_READ_UNCOMMITTED** - **定义**:允许一个事务读取另一个事务未提交的数据。 -...
在 Hibernate 中,事务隔离级别是指数据库系统提供的一种机制,以解决并发事务带来的问题。为了确保数据库的可靠性和一致性,Hibernate 提供了四种事务隔离级别,分别是 Serializable、Repeatable Read、Read ...
本资料主要探讨的是Spring支持的数据库事务传播属性和事务隔离级别。 一、事务传播属性 1. REQUIRED(默认):如果当前存在事务,则加入该事务;如果没有事务,则创建一个新的事务。这是最常见的事务定义,适用于...
如果需要事务支持,关闭自动提交;禁止在代码中出现DDL语句;使用NOW()获取当前时间;给每个字段指定表名前缀;避免不必要的排序;避免在WHERE子句中对字段施加函数;严格要求使用正确类型的变量;避免全模糊查询;...
疫情隔离-疫情隔离系统-疫情隔离系统源码-疫情隔离管理系统-疫情隔离管理系统java代码-疫情隔离系统设计与实现-基于springboot的疫情隔离系统-基于Web的疫情隔离系统设计与实现-疫情隔离网站-疫情隔离网站代码-疫情...
持久性(Durability):持久性指对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。 2. 隔离级别 Serializable(串行化):可避免脏读、不可重复读、幻读的发生。 Rep
Oracle 数据库隔离级别是数据库事务处理中的核心概念,它决定了事务在并发环境下如何访问和处理数据,以确保数据的一致性和完整性。隔离级别主要解决的是并发操作中的脏读、不可重复读和幻读问题。 脏读(Dirty ...