事务理解及Spring中的事务

一、隔离级别理解

1.脏读

首先理解,一个事务对数据进行了改变,尽管该事务尚未提交,但此时其他语句查到的数据,是该事务修改之后的。验证如下:

一张简单的user表

我们运行下面的语句123三行,开启事务,但是尚未提交

我们可以看到即使该事务尚未提交,但是此时查到的也是事务修改后的数据。

再看,运行如下56两行语句

所以,脏读,就是一个事务B读到的数据是另外一个事务A尚未提交的数据,这种情况称为脏读,因为如果A事务回滚了,那么B事务读取到的数据就是不正确的数据。

 2.不可重复读取

不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

3.幻读

事务A对表中符合条件的条数据进行了修改,此时事务B又插入了一条符合条件的数据并且提交给数据库了,那么如果此时事务A再去查看刚才的修改结果,发现还有一条数据没有被修改,或者A事务查询符合条件的数据,发现10条,此时B事务删除或插入了一条符合条件的数据,那A事务再查,发现结果为9条或者11条,出现了幻觉,这种情况就是幻读,也称虚读。

不可重复读取和幻读都是读取了已提交的事务操作过的数据,而脏读是读取了未提交的事务操作的数据。

二、Spring中的事务处理

Spring对事务提供了很好的支持,我们来看看spring中的事务处理方式

1.传播属性

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常

PROPAGATION_NESTED---新建事务,如果当前存在事务,把当前事务挂起。与PROPAGATION_REQUIRES_NEW的区别是父事务回滚,则子事务也需要回滚。

2.隔离级别

DEFAULT (默认)
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应

READ_UNCOMMITTED (读未提交)
这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。

READ_COMMITTED (读已提交)
保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读,这种方式是最常用的级别。

REPEATABLE_READ (可重复读)
保证事务不会修改已被其他事务读取但事务尚未提交或回滚的数据。这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读 ,但是资源消耗较大。

SERIALIZABLE(串行化)
这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。此种方式资源消耗最大。

时间: 2024-07-29 13:10:03

事务理解及Spring中的事务的相关文章

Spring中的事务传播行为

Spring在TransactionDefinition接口中定义了7种类型的事务传播行为,它们规定了事务方法是如何传播的. PROPAGATION_REQUIRED(最常用!):支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行. PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常. PROPAGATION_REQUIRES_NEW:新建事务,如果当

阶段3 2.Spring_10.Spring中事务控制_4 spring中事务控制的一组API

分析aop的 xml 的代码.更直观一些 事务提交和回滚就是我们重复的代码 spring业余事务管理器,我们拿过来直接用就可以 提交和回滚的后面直接调用释放.所以释放资源之类就是多余的 在绑定连接到线程的时候,直接就设置成false,所以开启事务这个通知 也是多余的 spring中的事务 需要先导入包pom.xml 用刚上线类.DataSourceTransactionManager 如果用到Hibernate的话.这个是真正带着代码的实现类 TransactionDefinition 事务的隔

关于Spring 中的事务

Spring中配置事务的方式有两种:xml配置事务,注解式事务 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Spring中注解事务方面的问题

我们可以在spring的配置文件beans.xml中对事务进行注解配置,这样在相应的类中就不用对事务进行管事,对于某个类,想单独交给spring来管理,那么就在相应的类上加入@Transactional来标记事务. 在默认情况下spring对于运行时的异常RuntimeException,是会进行回滚操作,如果在相应的方法上面加入@Transactional(noRollbackFor =RuntimeException.class),表示对于出现RuntimeException这样的异常不进行

Spring中的事务与数据库中的锁关系

本文只先简单的介绍下Spring中的事务与DB中锁的关系. 首先总结:Spring事务的实现本质上是使用的DB中的事务,而DB中的事务实现又主要依靠DB中的锁.所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁. 所以大家一定要厘清DB事务与DB各种锁的原理与概念.后续我也研究一下DB锁,并结合具体的生产环境监控数据来谈谈. <以下是转载部分内容.主要是Spring事务的使用方式.隔离级别之类的> 那么事务的隔离级别与锁有什么关系呢?本人认为事务的隔离级别是通过锁的

Spring中@Transactional事务回滚实例及源码

一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设我们默认删除对应的成员.但是在执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了.这时候我们希望如果成员删除失败了,之前删除的部门也取消删除.这种场景就可以使用@Transactional事物回滚. 二.checked异常和unc

Spring中@Transactional事务回滚(含实例详细讲解,附源码)

原文出处: 小宝鸽 一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设我们默认删除对应的成员.但是在执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了.这时候我们希望如果成员删除失败了,之前删除的部门也取消删除.这种场景就可以使用@Transactional事物回滚. 二.che

Spring中的事务

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource. TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为 SessionFactory,TransactionManager的实现为HibernateTransactionManager. 一.事务的

Spring中的事务管理

一.Spring事务管理用到的三个接口 a. PlatformTransactionManager 事务管理器 b. TransactionDefinition 事务定义信息(隔离.传播.超时.只读) c. TransactionStatus 事务具体的运行状态 二.Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现 事务 说明 org.springframework.jdbc.datasource.DataSourceTransactionM