9.1、回顾事务
ACID:原子性,一致性,隔离性,持久性
把一组业务当成一个业务,要么都成功要么都失败
9.2、 建立事务
-
建项目,导包
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.19</version> </dependency>
-
实体类,接口和实现类
-
配置文件
-
接口,配置文件和实现类中编写,添加和删除业务
<insert id="addUser" parameterType="user"> insert into user values(#{id},#{userName},#{password}) </insert> <delete id="deleteUser"> <!--故意写错删除语句,使添加,删除这一组事务执行不成功--> deletes from user where id=#{id} </delete>
-
将添加和删除放在一个方法内,使其变成一组业务
@Override public List<User> getUserList() { UserMapper mapper = sqlSessionTemplate.getMapper(UserMapper.class); User user = new User(11,"小刘","1111111111"); //在一个方法内,看作是一组事务 mapper.addUser(user); mapper.deleteUser(8); List<User> userList = mapper.getUserList(); return userList; }
-
测试,测试查询用户列表,结果报错,但是查看数据库,插入成功但删除失败,一组业务我们不希望出现一个成功一个失败的现象
9.3、Spring中的事务管理
-
声明式事务:AOP
-
在Spring配置文件中编织事务
<!--配置声明式事务--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <constructor-arg ref="dataSource"/> </bean> <!--结合AOP进行事务的织入--> <!--导入事务的约束文件--> <!--配置事务通知--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!--配置需要事务的方法,配置事务的传播特性:propagation传播特性,默认REQUIRED--> <tx:method name="add" propagation="REQUIRED"/> <tx:method name="delete"/> <tx:method name="update"/> <tx:method name="query" read-only="true"/> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!--配置事务切入--> <aop:config> <aop:pointcut id="pointCut" expression="execution(* com.likea.mapper.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/> </aop:config>
-
配置事务的传播特性:propagation传播特性
-
测试,代码报错,事务会进行回滚,并未插入成功
-
-
编程式事务:需要在代码中进行事务的管理
-
为什么需要事务
保证ACID原则
如果不配置事务,可能存在数据提交不一致的情况;
如果我们不在Spring中去配置声明式事务,我们就需要在代码中手动配置事务!
事务在项目的开发中十分重要,设计到数据的一致性和完整性问题,不容马虎!