我对事务的简单理解
事务:事务就是一系列的动作,它们被当做一个单独的工作单元,这些动作要么全部完成,要么都不起作用
事务管理:事务管理是企业级应用程序开发中心不可少的技术用来保证数据的完整性和一致性
事务的四个关键属性(A C I D)
* 原子性(automicity):事务是一个原子操作,由一系列的动作组成,这些动作要么全部完成,要么都不起作用
* 一致性(consistency)一旦事务动作完成,事务就提交,数据和资源处于一种满足业务规则的一致性的形态中
* 隔离性(isolation):可能有许多的事务会同时处理相同的数据,因此每个事务都应该与其他的事务隔离开来,防止数据收到损坏
* 持久性(durability)一旦事务完成,无论系统出现什么错误,它的结果都不应该收到影响,通常情况下,事务的结果被保存到持久化的存储器中
事务的实现
注解版本:beans.xml代码如下
<!-- 读取属性文件 激活${...}-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 数据源 -->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${shxt.driver}"/>
<property name="url" value="${shxt.url}"/>
<property name="username" value="${shxt.username}"/>
<property name="password" value="${shxt.password}"/>
</bean>
<!-- JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="druidDataSource"/>
</bean>
<!-- 事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"></property>
</bean>
<!-- 启动事务管理 -->
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>
只需在想要进行事务的方法或类上+上注解@Transactional(propagation = Propagation.REQUIRES)
propagation 的默认值为 Propagation.REQUIRES
当 事务方法去调用另一个事务方法时,且系统可能出现错误时
如果想让它们整体数据保持一致性和完整性只需在外层事务方法上加上@Transactional就行
如果里面的事务方法上注解为@Transactional(propagation = Propagation.REQUIRES_NEW),如果系统一旦出现错误,那么里面的 事务方法可能能完成外面的事务方法完成不了
2 Xml版本
<tx:advice id="methodAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 监控所有的方法 约定大于配置 有两套方案-->
<!-- 方案一 -->
<!-- <tx:method name="add*"/>
<tx:method name="insert*"/>
<tx:method name="create*"/>
<tx:method name="change*"/>
<tx:method name="edit*"/>
<tx:method name="update*"/>
<tx:method name="mod*"/>
<tx:method name="del*"/>
<tx:method name="remove*"/>
<tx:method name="cancel*"/>
<tx:method name="*" read-only="true"/> -->
<!--read-only="true"代表是只读 不许改变数据 -->
<!--方案二 -->
<tx:method name="load*" read-only="true"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="select*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!--配置aop的advice -->
<aop:config>
<aop:pointcut expression="execution(* com..service.*service.*(..))" id="aopPointCut"/>
<aop:advisor advice-ref="methodAdvice" pointcut-ref="aopPointCut" />
</aop:config>