千家信息网

spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理的方法

发表于:2025-02-20 作者:千家信息网编辑
千家信息网最后更新 2025年02月20日,小编给大家分享一下spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!1.事务的定义
千家信息网最后更新 2025年02月20日spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理的方法

小编给大家分享一下spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功。其必须遵循四个原则(ACID)。

  1. 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做;

  2. 一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确的状态,即数据完整性约束没有被破坏;如银行转帐,A转帐给B,必须保证A的钱一定转给B,一定不会出现A的钱转了但B没收到,否则数据库的数据就处于不一致(不正确)的状态。

  3. 隔离性(Isolation):并发事务执行之间互不影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性;

  4. 持久性(Durability):事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据不一致或丢失。

2.事务的类型

  1. 数据库分为本地事务跟全局事务

    • 本地事务:普通事务,独立一个数据库,能保证在该数据库上操作的ACID。

    • 分布式事务:涉及两个或多个数据库源的事务,即跨越多台同类或异类数据库的事务(由每台数据库的本地事务组成的),分布式事务旨在保证这些本地事务的所有操作的ACID,使事务可以跨越多台数据库;

  2. Java事务类型分为JDBC事务跟JTA事务

    • JDBC事务:即为上面说的数据库事务中的本地事务,通过connection对象控制管理。

    • JTA事务:JTA指Java事务API(Java Transaction API),是Java EE数据库事务规范, JTA只提供了事务管理接口,由应用程序服务器厂商(如WebSphere Application Server)提供实现,JTA事务比JDBC更强大,支持分布式事务

  3. 按是否通过编程分为声明式事务和编程式事务,参考http://blog.csdn.net/liaohaojian/article/details/70139151

    • 声明式事务:通过XML配置或者注解实现。

    • 编程式事务:通过编程代码在业务逻辑时需要时自行实现,粒度更小。

3.Spring事务隔离级别:spring有五大隔离级别,其在TransactionDefinition接口中定义。看源码可知,其默isolation_default(底层数据库默认级别),其他四个隔离级别跟数据库隔离级别一致。

  1. ISOLATION_DEFAULT:用底层数据库的默认隔离级别,数据库管理员设置什么就是什么

  2. ISOLATION_READ_UNCOMMITTED(未提交读):最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)

  3. ISOLATION_READ_COMMITTED(提交读):一个事务提交后才能被其他事务读取到(该隔离级别禁止其他事务读取到未提交事务的数据、所以还是会造成幻读、不可重复读)、sql server默认级别

  4. ISOLATION_REPEATABLE_READ(可重复读):可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(该隔离基本可防止脏读,不可重复读(重点在修改),但会出现幻读(重点在增加与删除))(MySql默认级别,更改可通过set transaction isolation level 级别

  5. ISOLATION_SERIALIZABLE(序列化):代价最高最可靠的隔离级别(该隔离级别能防止脏读、不可重复读、幻读)

    1. 丢失更新:两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,这是由于没有加锁造成的;

    2. 幻读:同样的事务操作过程中,不同时间段多次(不同事务)读取同一数据,读取到的内容不一致(一般是行数变多或变少)。

    3. 脏读:一个事务读取到另外一个未提及事务的内容,即为脏读。

    4. 不可重复读:同一事务中,多次读取内容不一致(一般行数不变,而内容变了)。

幻读与不可重复读的区别:幻读的重点在于插入与删除,即第二次查询会发现比第一次查询数据变少或者变多了,以至于给人一种幻象一样,而不可重复读重点在于修改,即第二次查询会发现查询结果比第一次查询结果不一致,即第一次结果已经不可重现了。

数据库隔离级别越高,执行代价越高,并发执行能力越差,因此在实际项目开发使用时要综合考虑,为了考虑并发性能一般使用提交读隔离级别,它能避免丢失更新和脏读,尽管不可重复读和幻读不能避免,但可以在可能出现的场合使用悲观锁或乐观锁来解决这些问题。

4.传播行为:有七大传播行为,也是在TransactionDefinition接口中定义。

  1. PROPAGATION_REQUIRED:支持当前事务,如当前没有事务,则新建一个。

  2. PROPAGATION_SUPPORTS:支持当前事务,如当前没有事务,则已非事务性执行(源码中提示有个注意点,看不太明白,留待后面考究)。

  3. PROPAGATION_MANDATORY:支持当前事务,如当前没有事务,则抛出异常(强制一定要在一个已经存在的事务中执行,业务方法不可独自发起自己的事务)。

  4. PROPAGATION_REQUIRES_NEW:始终新建一个事务,如当前原来有事务,则把原事务挂起。

  5. PROPAGATION_NOT_SUPPORTED:不支持当前事务,始终已非事务性方式执行,如当前事务存在,挂起该事务。

  6. PROPAGATION_NEVER:不支持当前事务;如果当前事务存在,则引发异常。

  7. PROPAGATION_NESTED:如果当前事务存在,则在嵌套事务中执行,如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作(注意:当应用到JDBC时,只适用JDBC 3.0以上驱动)。

5.Spring事务支持

1.spring提供了很多内置事务管理器,支持不同数据源。常见的有三大类

  • DataSourceTransactionManager:org.springframework.jdbc.datasource包下,数据源事务管理类,提供对单个javax.sql.DataSource数据源的事务管理,只要用于JDBC,Mybatis框架事务管理。

  • HibernateTransactionManager:org.springframework.orm.hibernate3包下,数据源事务管理类,提供对单个org.hibernate.SessionFactory事务支持,用于集成Hibernate框架时的事务管理;注意:该事务管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本;

  • JtaTransactionManager:位于org.springframework.transaction.jta包中,提供对分布式事务管理的支持,并将事务管理委托给Java EE应用服务器,或者自定义一个本地JTA事务管理器,嵌套到应用程序中。

内置事务管理器都继承了抽象类AbstractPlatformTransactionManager,而AbstractPlatformTransactionManager又继承了接口PlatformTransactionManager

Spring框架支持事务管理的核心是事务管理器抽象,对于不同的数据访问框架通过实现策略接口PlatformTransactionManager,从而能支持多钟数据访问框架的事务管理。

PlatformTransactionManager接口定义如下

TransactionStatus接口定义如下:
public interface TransactionStatus extends SavepointManager {         boolean isNewTransaction();  //返回当前事务是否是新的事务       boolean hasSavepoint();  //返回当前事务是否有保存点       void setRollbackOnly();  //设置事务回滚       boolean isRollbackOnly();  //设置当前事务是否应该回滚       void flush();  //用于刷新底层会话中的修改到数据库,一般用于刷新如Hibernate/JPA的会话,可能对如JDBC类型的事务无任何影响;       boolean isCompleted();  //返回事务是否完成}

2.Spring分布式事务配置

  • 引用应用服务器(如Tomcat)的JNDI数据源,间接实现JTA事务管理,依赖于应用服务器

  • 直接集成JOTM(官网:http://jotm.objectweb.org/)、Atomikos(官网:https://www.atomikos.com/)提供JTA事务管理(无应用服务器支持,常用于单元测试)

  • 使用特定于应用服务器的事务管理器,使用JTA事务的高级功能(Weblogic,Websphere)

1).引用应用服务器(如Tomcat)的JNDI数据源,间接实现JTA事务管理,配置如下

                                               

2)使用Atomikos实现分布式事务管理,配置如下:

                                                                                                                                              classpath:public.properties                                                                                                                                                                                                                                                 ${db.jdbcUrlOne}                ${user}                ${password}                                                                                                                                                                ${db.jdbcUrlTwo}                ${user}                ${password}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      org.springframework.web.servlet.view.InternalResourceView                                                                        /                                                                        .jsp                                                                                                                                  no                          105,179,90                          red                          200                          60                          80                          code                          4                          宋体,楷体,微软雅黑                                                                                                                  

看完了这篇文章,相信你对spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理的方法有了一定的了解,想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

事务 数据 管理 事务管理 数据库 级别 隔离 支持 应用 分布式 一致 接口 服务器 服务 数据源 更新 内容 框架 查询 行为 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全使用哪些网络活动 维护网络安全的基本内容 北京丰巢网络技术有限公司 服务器怎么输入游戏id 适合网络技术的ppt 达梦数据库客户端下载 代码清除数据库 2019微期货软件开发 安卓开发需要学数据库吗 软件开发部门问题 海南耀天网络技术有限公司游戏客服电话 阿里云服务器安全告警在哪 软件开发及销售是哪种执照 网络安全靠大家主持搞 出国留学软件开发专业好 山西省超级服务器云服务器 数字货币属于网络安全吗 快递企业的数据库模型 数据库建立的七大步骤 网络安全板块为什么突然启动 我为网络安全献策 服务器维保应急预案 广州佛山有什么软件开发学校 海南高科技软件开发报价 蓉涛网络技术工作室怎么样 宽带网络技术发展历程 运营商异地网络技术 高校新设网络安全专业 威海智能养老软件开发 clso网络安全工程师
0