事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
配置事务管理
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 源自于mybatis,也就是看dao.xml-->
<property name="dataSource" ref="dataSource"></property>
</bean>
声明式事务
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
拦截器方式配置事物
<!-- 通知事务系列方法 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--定义属性,声明事务规则 -->
<tx:attributes>
<!-- REQUIRED意思是如果当前事务不存在,就创建一个事务 -->
<tx:method name="transfer*" propagation="REQUIRED"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="create*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="edit*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="remove*" propagation="REQUIRED"/>
<tx:method name="drop*" propagation="REQUIRED"/>
<tx:method name="pay*" propagation="REQUIRED"/>
<!-- SUPPORTS意思是 如果当前没有事务存在,就以非事务的方式执行 -->
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="query*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="search*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
/**
注释:<tx:advice id="txAdvice" transaction-manager="txManger">这个 transaction-manager必须是事务管理器的名字,下面的 是方法的开头 比如说 service层的方法保存是以save什么什么,那配置的时候就save* 就是以save开头的方法获取事务。
*/
这个配置很重要,切面的切入位置
<!-- 这个配置很重要,切面的切入位置-->
//定义切面
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* com..service..*.*(..))"/>
<!-- 将事务增强与切入点组合(织入事务切面) -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
具体使用那个方法:
service层也是运用的@Transactional注解,直接加在方法上,只对此方法生效
需要事物的具体操作需要try{}catch(){}
@Transactional
@Override
public int insertProject(Project project) {
int i,j;
// TODO Auto-generated method stub
try{
i = numeralLoginDao.insertInToResellAll(project);//操作1
j = numeralLoginDao.deleteTemporaryResell(project.getPhonenumber());//操作2
if(i==0||j==0){
throw new Exception();
}
}catch(Exception e){
System.out.println("数据操作错误");
}
return null;
}
这样只要发生定义的和未知的错误都会回滚!