事务
事务
- 涉及到数据的一致性问题
- 确保完整性和一致性
- ACID原则:
- 原子性:要么都成功,要么都失败;
- 一致性:事务前后数据的完整性没有被破坏;
- 隔离性:事务与事务之间相互隔离;
- 持久性:事务完成后,数据的修改是永久的,不会因为机器重启等原因丢失;
- 事务举例:
insertUser();//可以正确执行 deleteUser();//执行报错 //结果:insert成功,delete失败
普通情况下,delete未成功执行,但insert仍然会执行,我们如果想要这两个事务操作为一个整体,即如果delete失败,那么insert也不要执行。此时,我们就需要声明式事务;
Spring事务
- MyBatis-Spring 允许 MyBatis 参与到 Spring 的事务管理中。而不是给 MyBatis 创建一个新的专用事务管理器,MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理。
- 一旦配置好了 Spring 的事务管理器,就支持 @Transactional 注解和 AOP 风格的事务配置。
- 在事务处理期间,一个单独的 SqlSession 对象将会被创建和使用。当事务完成时,这个 session 会以合适的方式提交或回滚。
- 事务配置好了以后,MyBatis-Spring 将会透明地管理事务。这样在你的 DAO 类中就不需要额外的代码了。
- 声明式事务:AOP
- 编程式事务:硬编码形式在代码中,进行事务管理
- 在spring配置文件中,配置事务管理器,并注入DataSource
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <constructor-arg ref="dataSource" /> </bean>
注意:为事务管理器指定的 DataSource 必须和用来创建 SqlSessionFactory的是同一个数据源,否则事务管理器就无法工作了。
- 结合AOP实现事务的织入
- 配置事务通知的切面:引入tx约束,设置事务管理器、事务装配的方法、以及事务传播特性:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=
- 配置事务通知的切面:引入tx约束,设置事务管理器、事务装配的方法、以及事务传播特性: