1.事务由四个特性:ACID
原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用【要么做,要么不做】
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。【操作一致,保数据完整】
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。【处理数据独立,互不干扰】
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。【数据持久保存】
2.事务传播行为:当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。
PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。
3.事务隔离级别
Read Uncommitted(一个事务可以读取另一个事务未提交内容)最低级别,任何情况都无法保证
Read Committed(一个事务只能读取另一个事务提交的内容)可避免脏读的发生。
Repeatable Read(对一个事务的内容可以多次重读,多次提交)可避免脏读、不可重复读的发生。
Serializable(可串行化,按事务顺序执行)可避免脏读、不可重复读、幻读的发生。(最高级)
4.事务超时
所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。 默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。
5.事务只读属性
只读事务用于客户代码只读但不修改数据的情形,只读事务用于特定情景下的优化,比如使用Hibernate的时候。默认为读写事务。
二、spring4集合Hibernate5的事务配置:声明式事务管理配置,的细粒度只能到方法级别,也就是一整个方法就是一个事务,方法结束后提交事务。编程式事务可以在方法局部创建事务,并提交,一般使用try/catch捕获异常并对未成功的事务进行回滚操作。一下是声明式事务的一种配置方式。
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
">
<!-- 导入properties配置文件 -->
<context:property-placeholder location="classpath*:/jdbc.properties"/>
<!-- 扫描注解包 -->
<context:component-scan base-package="dao.daoImpl"/>
<context:component-scan base-package="service.serviceImpl" />
<!-- 数据源基本配置 -->
<bean>
<property value="${jdbc.username}"/>
<property value="${jdbc.password}"/>
<property value="${jdbc.url}"/>
<property value="${jdbc.driverClassName}"/>
</bean>