栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring的事务处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring的事务处理

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

1)什么是事务?
事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。

2)事务的特性(ACID)
原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。

一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。

隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。

持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

3)TransactionDefinition:事务定义信息
事务定义信息有:

隔离级别

传播行为

超时信息

是否只读

4)如果不考虑隔离性会引发安全性问题
隔离级别:定义了一个事务可能受其他并发事务影响的程度。
并发事务引起的问题:典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务。并发虽然是必须的,但可能会导致以下的问题。

脏读(Dirty reads)——脏读发生在一个事务读取了另一个事务改写但尚未提交的数据时。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。

不可重复读(Nonrepeatable read)——不可重复读发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间进行了更新。

幻读(Phantom read)——幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录。

5)解决读问题:设置事务的隔离级别
未提交读:脏读,不可重复读,虚读都有可能发生

已提交读:避免脏读。但是不可重复读和虚读都有可能发生

可重复读:避免脏读和不可重复读。但是虚读有可能发生

串行化的:避免以上所有读问题

mysql数据库的默认隔离级别就是可重复读,Oracle默认是已提交读

6)事务的传播行为
PROPAGATION_XXX:事务的传播行为。

保证在同一个事务中
PROPAGATION_REQUIRED:required , 必须。支持当前事务,如果不存在,就新建一个(默认)
PROPAGATION_SUPPORTS:supports ,支持。支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY:mandatory ,强制。支持当前事务,如果不存在,就抛出异常

保证没有在同一个事务中
PROPAGATION_REQUIRES_NEW:requires_new,必须新的。如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED:not_supported ,不支持。以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER:never,从不。以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED:nested ,嵌套。如果当前事务存在,则嵌套事务执行

关于事务的传播行为我会另起一篇详细介绍,最好要理解,实在不理解也没关系,随着时间的推移,代码的进步会慢慢理解的。

7)事务超时
为了使应用程序很好地运行,事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定,所以长时间的事务会不必要的占用数据库资源。事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。

8)只读
这是事务的第三个特性,是否为只读事务。如果事务只对后端的数据库进行该操作,数据库可以利用事务的只读特性来进行一些特定的优化。通过将事务设置为只读,你就可以给数据库一个机会,让它应用它认为合适的优化措施。

Spring进行事务操作的方式

编程式事务管理声明式事务管理

基于xml配置文件方式基于注解方式 

总结Spring事务

1.管理事务的是 事务管理和他的实现类

  2.spring的事务是一个统一模型

     1)指定要使用的事务管理器实现类,使用

     2)指定哪些类,哪些方法需要加入事务的功能

     3)指定方法需要的隔离级别,传播行为,超时

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/786021.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号