博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring(七):事务管理
阅读量:7215 次
发布时间:2019-06-29

本文共 3231 字,大约阅读时间需要 10 分钟。

hot3.png

1、理解事务

    在软件开发领域中,全有或全无的操作被称为事务

    事务允许你将几个操作组合成一个要么全部发生要么全部不发生的工作单元。

1.1、事务的特性

    事务的4个特性ACID:

  • 原子性(Atomic):事务是由一个或多个活动所组成的一个工作单元。

        原子性确保事务中的所有操作全部发生或全部不发生。所有活动成功事务才成功,任意一个活动失败了事务也失败并回滚。

  • 一致性(Consistent):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态。

  • 隔离性(Isolated):事务允许多个用户对相同的数据进行操作,每个用户的操作不会与其他用户纠缠在一起。

        事务应该被彼此隔离,避免发生同步读写相同数据的事情(隔离性往往涉及到锁定数据库的行或表)。

  • 持久性(Durable):一旦事务完成,事务的结果应该持久化,这样就能从任何的系统崩溃中恢复过来。

        这一般涉及将结果存储到数据库或其他形式的持久化存储中。

1.2、Spring对事务管理的支持

    如果应用程序只使用一种持久化资源,Spring可以使用持久化机制本身所提供的事务性支持,包括了JDBC、Hibernate以及Java持久化API(Java Persistent API,JPA)。

    但是如果应用程序的事务跨多个资源,那么Spring会使用第三方的JTA实现来支持分布式事务。

    Spring支持编码式事务和声明式事务,编码式事务允许用户在代码中精确定义事务的边界,而声明式事务(基于AOP)有助于用于将操作与事务规则进行解耦。

2、选择事务管理器

    Spring并不直接管理事务,而是提供了多种事务管理器,它们将事务管理的职责委托给JTA(Java Transaction API)或其他持久化机制所提供的平台相关的事务实现。

Spring几种常见的事务管理器:

事务管理器 使用场景
jdbc.datasource.DataSourceTransactionManager 用于Spring对JDBC抽象的支持,也可以用于使用Mybatis进行持久化的场景
org.hibernate3.HibernateTransactionManager
用于Hibernate3进行持久化
orm.jpa.JpaTransactionManager 用于java持久化API(JPA)进行持久化
transaction.jta.JtaTransactionManager
需要分布式事务或者没有其他的事务管理器满足需求

3、声明式事务

    Spring对声明式事务的支持是通过使用Spring AOP框架实现的。这是很自然的一件事,因为事务是在应用程序主要功能之上的系统服务。可以将Spring事务想象成方法”包装“上事务边界的切面。

3.1、事务属性

事务属性包含了5个方面:传播行为、隔离级别、是否只读、事务超时、回读规则。

    传播行为

    传播行为定义了客户端与被调用方法之间的事务边界。Spring定义了7种不同的传播行为,都在org.springframework.TransactionDefinition接口中以常量的方式进行了定义。

传播行为 含义
PROPAGATION_MANDATORY 表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常
PROPAGATION_NESTED 表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。(注意,各厂商对这种传播行为的支持是有所差异的。)
PROPAGATION_NEVER 表示当前方法不应该运行在事务上下文中,如果当前正有一个事务在运行,则会抛出异常。
PROPAGATION_NOT_SUPPORTED 表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将会被挂起,如果使用JTATransactionManager的话,则要访问TransactionManager。
PROPAGATION_REQUIRED 表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行,否则,会启动一个新的事务。
PROPAGATION_REQUIRES_NEW 表示当前方法必须运行在它自己的事务中。一个新的事务将会被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起,如果使用JTATransactionManager的话,则要访问TransactionManager。
PROPAGATION_SUPPORTS 表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行。

    

    隔离级别

    隔离级别定义了一个事务可能受其他并发事务影响的程度。多个事务并发运行可能导致的问题:脏读、不可重复读、幻读。

隔离级别 含义
ISOLATION_DEFAULT 使用后端数据库默认的隔离级别
ISOLATION_READ_UNCOMMITTED 允许读取尚未提交的数据变更。可能会导致脏读、幻读或不可重复读
ISOLATION_READ_COMMITED 允许读取并发事务已经提交的数据。可以组织脏读,但是幻读或不可重复仍有可能发生
ISOLATION_REPEATABLE_READ 对同一字段的多次读取结果是一致的,除非数据是被本事务自己所修改。可以组织脏读和不可重复读,但幻读仍有可能发生
ISOLATION_SERIALIZABLE 完全服从ACID的隔离级别,确保组织脏读、不可重复读以及幻读。这是最慢的事务隔离级别。因为它通常是通过完全锁定事务相关的数据库表来实现的。

    注意:并不是所有的数据源都支持所列的隔离级别。

    

    只读

    通过将事务设置为只读,你可以给数据库一个机会,让它应用它认为合适的优化措施。  

    事务超时

    为了使应用程序很好地运行,事务不能运行太长时间。可以在特定的秒数后自动回滚,而不是等待其结束。

    回滚规则

    这些规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有在遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚。

3.2、Spring xml中声明事务

    当利用<tx:advice>声明事务的时候,还需要一个事务管理器transactionManager。

    <tx:advice>只是定义AOP通知,用于把事务边界通知给方法,但是这只是事务通知,而不是完整的事务性切面。我们需要定义一个通知器(advisor),才能构成完整的事务性切面,

    
        
        
        
        
        
        
        
        
        
    
    
    

3.3、定义注解驱动的事务

    在Spring xml中配置<tx:annotation-driven />,可以通过其transactionmanager属性来指定特定的事务管理器。

    <tx:annotation-driven>元素告诉Spring检查上下文中所有的Bean并查找使用@Transactional注解的Bean,而不管这个注解是用在类级别上还是方法级别上。对于每一个使用@Transactional注解的Bean,<tx:annotation-driven>会自动为它添加事务通知。

转载于:https://my.oschina.net/u/1020238/blog/509768

你可能感兴趣的文章
python之字符串的操作和使用
查看>>
eclipse搭建ssm框架
查看>>
CSS div阴影效果
查看>>
显示所有SAP图标的ABAP代码
查看>>
group by 与 order by 一起使用的时候
查看>>
HTML+CSS
查看>>
链接服务器创建
查看>>
用Vue的方式实现复选框
查看>>
mac下安装xampp、及其之上的组件安装
查看>>
C++内存对齐总结
查看>>
Web设计的速查卡(转)
查看>>
数据结构之哈夫曼树
查看>>
hdu1038
查看>>
CentOS 6.4下Zabbix的安装配置
查看>>
前端开发注意的问题 ,浏览器兼容性
查看>>
centos和redhat下 uwsgi配置
查看>>
Markdown 学习笔记
查看>>
vue-element-admin 多层路由问题
查看>>
Css问题 margin float 文档流 背景图底部充满
查看>>
JS match() 方法 使用
查看>>