Spring学习笔记——第十二部分 事务(完结撒花)
- 把一组业务当成一个业务来做:要么都成功,要么都失败。
- 确保完整性和一致性。
- 事务十分重要。
1. AICD原则
- 原子性(Atomicity):一个事务要么全部执行,要么不执行。即一个事务不可能只执行了一半就停止了。
比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱。
不可能划了卡,而钱却没出来。这两步必须同时完成,要么就不完成。 - 一致性(Consistency):是指事务的运行并不改变数据库中数据的一致性。
例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。 - 独立性(Isolation):事务的独立性也称作隔离性,是指两个以上的事务不会出现交错执行的状态。
因为这样可能会导致数据不一致,更加具体的来讲,就是事务之间的操作是独立的。 - 持久性(Durability):事务的持久性是指事务执行成功以后,该事务对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚。
MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理。
一旦配置好了 Spring 的事务管理器,你就可以在 Spring 中按你平时的方式来配置事务。
2. Spring中的事务管理(声明式事务)
- 声明式事务:AOP
- 编程式事务:需要在代码中进行事务管理
2.1 Spring中七种propagation类的事务属性详解
2.2 spring-dao.xml
<!--配置声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource" />
</bean>
<!--结合AOP实现事务管理-->
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--配置事务切入-->
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* com.zhang.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
2.3 UserMapperImpl.java
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{
public List<User> selectUser() {
return getSqlSession().getMapper(UserMapper.class).selectUser();
}
public int addUser(User user) {
return getSqlSession().getMapper(UserMapper.class).addUser(user);
}
public int deleteUser(int id) {
return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
}
}
2.4 测试类
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
User user = new User(5, "小王", "32132132");
userMapper.addUser(user);
userMapper.deleteUser(5);
}
2.5 UserMapper.xml
<delete id="deleteUser" parameterType="int">
deletee from mybatis.user where id=#{id}
</delete>
- 很明显上面的语句错把delete写成了deletee,我们希望在运行时要么都成功,要么都失败。
- 当不配置2.2的语句时,会报出错误,但依然会执行addUser,而不执行deleteUser。
- 此时配置事务,依然会报错,但是数据库中的数据没有改变。