spring线程中事务
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于spring线程中事务内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在spring线程中事务相关知识领域提供全面立体的资料补充。同时还包含 safari浏览器、samba、SAMP 的知识内容,欢迎查阅!
spring线程中事务相关知识
-
Spring 中事务浅析1-概念PlatformTransactionManager事务管理器,管理事务的各生命周期方法, TransactionAttribute事务属性, 包含隔离级别,传播行为,是否只读等信息 TransactionStatus事务状态 TransactionInfo事务信息,内含TxMgr, TxAttr, TxStatus等信息 TransactionSynchronization事务同步回调,内含多个钩子方法 TransactionSynchronizationManager事务同步管理器,维护当前线程事务资源,信息以及TxSync集合2- Spring中的Propagation枚举和TransactionDefinition接口定义了7种事务传播行为REQUIRED 如果当前无事务则开启一个事务,否则加入当前事务。 SUPPORTS 如果当前有事务则加入当前事务。 MANDATORY 如果当前无事务则抛出异常,否则加入当前事务。 REQUIRES_NEW 如果当
-
Spring的统一事务模型组内每周都有技术分享,轮着来,人人有份。刚来一个月不到,就轮到我了。看了一个星期的Spring事务,分享之,反响还不错。遂将屁屁踢改成文稿,和诸君共食。难度一般,老少咸宜。Spring事务的知识体系进入主题之前,先来了解一下Spring事务,都有哪些内容:Spring事务包含对分布式事务和单机事务的支持,我们用的比较多的是单机事务,也就是只操作一个数据库的事务。单机事务,按照用法分,又可以分为编程式事务模型(TransactionTemplate)和声明式事务模型(@Transactional注解),后者可以理解为 aop + 编程式事务模型。编程式事务模型里面涉及到很多知识点,比如统一事务模型、事务传播级别、事务隔离级别等。我们今天要讲的是其中一点,统一事务模型。希望这次的分享能够让大家,对Spring事务有一个整体性的认识。不仅仅是TemplateSpring的统一事务模型,解决的一个核心问题,就是不管你用的是什么数据访问方式,Hibernate、MyBatis抑或是JDBC,你的Service层的代码
-
Spring 编程式事务管理Spring 编程式事务管理编程式事务管理方法允许你在对你的源代码编程的帮助下管理事务。这给了你极大地灵活性,但是它很难维护。在我们开始之前,至少要有两个数据库表,在事务的帮助下我们可以执行多种 CRUD 操作。以 Student 表为例,用下述 DDL 可以在 MySQL TEST 数据库中创建该表:CREATE TABLE Student( ID INT NOT NULL AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, PRIMARY KEY (ID) );第二个表是 Marks,用来存储基于年份的学生的标记。这里 SID 是 Student 表的外键。CREATE TABLE Marks( SID INT NOT NULL, MARKS INT NOT NULL, YEAR INT NOT NULL );让我们直接使用 PlatformTransactionManager 来
-
Spring源码剖析9:Spring事务源码剖析转自:http://www.linkedkeeper.com/detail/blog.action?bid=1045 <!-- more --> 声明式事务使用 Spring事务是我们日常工作中经常使用的一项技术,Spring提供了编程、注解、aop切面三种方式供我们使用Spring事务,其中编程式事务因为对代码入侵较大所以不被推荐使用,注解和aop切面的方式可以基于需求自行选择,我们以注解的方式为例来分析Spring事务的原理和源码实现。 首先我们简单看一下Spring事务的使用方式,配置: <tx:annotation-driven transaction-manager="transactionManager
spring线程中事务相关课程
spring线程中事务相关教程
- 3. 线程上下文 current_session_context_class 可配置值除 thread 外还有 jta、managed 等,简单描述下:当使用本地 Jdbc 事务时选择 Thread。当使用全局 jta 事务时选择 jta。当使用 session 管理机制时选择 managed;如和 Spring 一起整合使用时,使用 Spring 的事务管理机制。主要聊聊 thread 上下文是如何实现保存 Session,回顾一下上一节课程 HibernateSessionFactory 类中的代码片段:private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();public static Session getSession() throws HibernateException { Session session = (Session)threadLocal.get(); aif(session == null || !session.isOpen()) { session = (sessionFactory!= null) ? sessionFactory.openSession():null; threadLocal.set(session); } return session;}实现的关键就在于 ThreadLocal 这个类,ThreadLocal 是 Java SE 原生 API,此类实例化对象本质就是一个 Map 集合,与 Map 保存数据时不同,key 由线程对象充当。使用此对象可以为每一个线程保存只属于当前线程的数据。HibernateSessionFactory 中重构过的 getSession() 方法解析如下:以当前线程对象为 key 查询 threadLocal 集合中是否存在 Session 对象,如有直接返回;Session session = (Session) threadLocal.get();return session;如果没有,则创建 Session 对象,用当前线程作为 key 保存 Session 对象到 threadLocal 对象中。if(session == null || !session.isOpen()) { session = (sessionFactory!= null) ? sessionFactory.openSession():null; threadLocal.set(session);}如上面代码所述,只要线程生命周期没走到尽头,与其关联的 Session 对象就能重复使用。并且每一个线程中使用的是与本线程相关联的 Session,避免了多线程环境下 Session 变成临界资源,避开线程安全隐患。
- 1. Ruby 中的线程 通俗一点来讲,线程可以让程序同时执行多项操作。比如:读取多个文件、处理多个请求、建立多个API连接。多线程可以更好地利用CPU的核心,CPU的一个核好比一个普通人,一个普通人只能干一件事,多个人可以分开干不同的事或干很多次同样的事。注意事项:在MRI(Matz 的 Ruby 解释器)中,这是运行 Ruby 应用程序的默认方式,只有在运行 I/O 绑定的应用程序时,您才能从线程中受益。由于存在 GIL(Global Interpreter Lock,是由编程语言解释器线程持有的互斥锁,以避免与其他线程共享不是线程安全的代码。),因此存在此限制。对于一般的 Ruby 和 Python 应用,即使在多核处理器上运行,使用 GIL 的解释器始终总是允许一次仅执行一个线程。每个进程都有至少一个线程,您可以按需创建更多线程。
- 4. 主从多线程模型 架构图分析:主要分为三个模块,分别为 Reactor 主线程、Reactor 子线程、Worker 线程池。其中 Reactor 主线程可以对应多个 Reactor 子线程,也就是说,一个 MainReactor 对应多个 SubReactor;Reactor 主线程的 MainReactor 对象通过 select 监听客户端连接事件,收到事件之后,通过 Acceptor 处理连接事件;当 Acceptor 处理连接事件之后,MainReactor 将连接事件分配给 Reactor 子线程的 SubReactor 进行处理;SubReactor 将连接加入到连接队列进行监听,并且创建 Handler 处理对应的事件。一旦有新的事件(非连接)则分配给 Handler 进行处理;Handler 通过 read () 方法读取数据,并且分发给 Worker 线程池去做业务处理;Worker 线程池分配线程去处理业务,处理完成之后把结果返回给 Handler;Handler 收到 Worker 线程返回的结果之后,再通过 send () 方法返回给客户端。方案的优点:责任明确,单一功能拆分的更细,Reactor 主线程负责接收请求,不负责处理请求;Reactor 子线程负责处理请求。并发量很高的情况,可以减轻单个 Reactor 的压力,并且提高处理速度;Reactor 子线程只负责读取数据和响应数据,耗时的业务处理则丢给 Worker 线程池去处理。这种通过把完整任务层层分发下去,每个组件需要处理的内容就会变的很简单,处理起来效率自然会很高。方案的缺点:编程复杂度非常的高;即使一个 Reactor 主线程对应多个 Reactor 子线程,Reactor 主线程还是会存在单节点故障问题,不过真实业务场景当中,如果考虑单节点故障问题的话,一般都是通过分布式集群(Netty 集群)的方式去解决,而不是靠单节点的线程模型去解决,这里大家了解一下即可。总的来说,主从多线程模型是应用比较多的一种线程模型,包括 Nginx 主从 Reactor 多线程模型、Memcached 主从多线程模型、Netty 主从多线程模型等知名开源框架的。
- 9.1 事务管理器 transactionManager 在 xml 文件中对应 <transactionManager type="JDBC"/>,其中 type 属性对应了事务管理器的两种类型,分别是JDBC和MANAGED。JDBC :直接使用了 JDBC 的提交和回滚机制。MANAGED:让容器来管理事务的整个生命周期,例如 spring 容器。提示: 如果你使用 spring 作为容器,那么 transactionManager 会被自动配置且可用。
- 4. 单 Reactor 单线程 单 Reactor 单线程模型,和上面的模型优化思路是类似的,具体如下:架构图说明Select 是 I/O 多路复用模型的标准网络编程 API,可以实现应用程序通过一个堵塞对象监听多路连接请求。Reactor 对象通过 Select 监听客户端请求事件,收到事件之后通过 Dispatch 进行分发;如果事件类型是连接请求事件,则由 Acceptor 处理连接请求;如果事件类型是普通业务(比如:客户端发送业务请求),则创建 Handler 来读取数据、业务处理、响应数据。这种模式架构简单,但是存在以下缺点,具体如下:如果客户端的连接数量很多的情况下,将无法支撑,因为负责处理客户端请求的 Reactor 只有一个;负责处理业务的 Handler 只有一个,也就是说只有一个子线程负责处理具体业务,无法很好的利用多核 CPU 的性能;如果线程出现问题,比如:意外终止、进入死循环,那么整个系统的通讯功能将会收到影响,造成通讯故障。单 Reactor 单线程模型,一般适用于客户端数量比较少,业务处理复杂度很低,处理起来速度非常快的情况,因此真实业务场景不太建议使用。
- 2. 事务 什么是事务?一讲到事务,就有一个典型的案例:转账。转账业务涉及到 2 个账号的变更。例如 A 现在要把自己账户上仅有的 100 元大钞转给自己的好朋友 B。转账过程中至少要涉及到两条更新语句:A 账面上的钱减少,使用更新语句实现:Update 账号表 set 我的钱=我的钱-100 where 账号拥有人=AB 账户上的钱增多,使用更新语句实现:Update 账号表 set 我的钱=我的钱+100 where 账号拥有人=B如果、万一这两条更新语句中有一条没有执行成功,会发生什么情况了?发生在 A 身上的更新语句没有成功,B 的更新语句成功了。也就是说 A 账面上的钱没有减少,B 账面上的钱却增加了。天呀!这是何等好事,关键是这钱是从哪里来的,左想右想,看来只能是银行里来的,但是,你觉得银行会做这种傻事吗?不会!那银行又是如何保证不让这种事情发生了。发生在 B 身上的更新语句没有成功,A 的更新语句成功了。也就是说 A 的钱减少了,但是 B 没有增加。傻眼了吧,莫名其妙的钱就不见了。钱去哪儿了?你会让这种事情发生吗?也不会,你会投诉银行的。当然,如果这 2 条 SQL 语句执行成功或者失败,则不会发生任何损失,可见,咱们必须控制这两条 SQL 语句要么都成功,要么都失败。对!这就是事务。所谓事务,就是把一个业务逻辑当成一个逻辑整体单元,其中的执行代码要么一起成功,但凡执行过程中出现了某些错误,就恢复到最原始的状态。转账就是一个业务逻辑,整个业务逻辑中至少包括 2 条 SQL 语句,这 2 条 SQL 语句互为依靠,彼此脱单对业务逻辑没有任何意义。所以,必须当成一个整体看待。一个事务单元有 4 个特性,也就是事务的 ACID 特性:原子性(atomicity): 表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败;一致性(consistency): 表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态;如前面转账案例,转账前 A 和 B 加起来有多少钱,无论转账是否成功,最后 A 和 B 加起来的钱应该和前面相等;隔离性(isolation): 事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据;持久性(durability): 事务完成之后,它对于系统的影响是永久性的。事务结束后,就没有什么后悔药了。4 个特性中除了隔离性都比较好理解。所以,剩下的篇幅中,咱们好好聊一聊隔离性。要讲透隔离性,肯定就离不开并发概念。什么是并发?并发是计算机中的一个概念,但是在现实生活中还是能找到一个能类比的例子。火车上,2个人同时去一间洗手间,这个过程可以称其为并发。换成计算机概念就是说两段逻辑代码同时使用同一个资源。当然,这里只是从宏观上理解并发。老公和老婆共用一个账号,大家需要钱时都从这个账号上取,可假设老公和老婆就是两个事务,这 2 个事务如果同时取钱时,就必须隔离,否则就会出现麻烦。2 个事务同时进入这个账号,一查看,很高兴,账面上有钱,于是都想取出这 1000 块钱。银行肯定只能让一个事务成功,要不然银行就亏大了。这便是事务的隔离机制,当一个事务对一个资源进行操作时,必须隔离另一个事务对其进行相关操作。但是,如果隔离的太严格了,事务之间就如同排队,需要一个一个来,将会降低系统的响应时间,使用者会认为,切!这系统设计的够糟糕的,睡了一觉,还没有响应。如果隔离的太宽松了,受事务之间的影响,会发生数据的异常。所以在 JDBC 中一般会提供多种隔离机制,让开发者根据需要进行选择。事务隔离级别从低到高:读取未提交(Read Uncommitted);读取已提交 (Read Committed);可重复读(Repeatable Read);序列化(serializable)。如何选择,当然是需要根据业务需要进行设定。不同的隔离机制下,并发的事务之间会发生一些什么样的事情?
spring线程中事务相关搜索
-
s line
safari浏览器
samba
SAMP
samplerate
sandbox
sanitize
saper
sas
sass
save
smarty模板
smil
smtp
snapshot
snd
snmptrap
soap
soapclient
soap协议