陕西做网站公司有哪些/百度推广网站一年多少钱
13、声明式事务
1、回顾事务
- 把一组业务当成一个业务来做;要么都成功,要么都失败!
- 事务在项目开发中,十分重要,涉及到数据一致性问题,不能马虎!
- 确保完整性和一致性;
事务的ACID原则:
- 原子性
- 一致性
- 隔离性
- 多个业务可能操作同一个资源,防止数据损坏
- 持久性
- 事务一旦提交,无论系统发生什么问题,结果都不会被影响,被持久化的写到存储器中!
将之前的代码修改一下
-
增加两个接口
//添加一个用户 public int addUser(User user);//删除一个用于 public int deleteUser(int id);
-
在mapper文件中写sql语句(注意这里故意把第二条的sql语句写错)
<insert id="addUser" parameterType="user">insert into user (id,name,pwd)values (#{id},#{name},#{pwd}); </insert><delete id="deleteUser" parameterType="_int">deletes from user where id=#{id} </delete>
-
编写实现类
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{public List<User> selectUser() {User user = new User(5, "小王", "213213");UserMapper mapper = getSqlSession().getMapper(UserMapper.class);mapper.addUser(user);mapper.deleteUser(5);return mapper.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);} }
-
测试(测试是肯定会报错的,主要验证是否会执行addUser方法)
public class MyTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");UserMapper userMapper = context.getBean("userMapper", UserMapper.class);List<User> userList = userMapper.selectUser();for (User user : userList) {System.out.println(user);}} }
报错:sql异常
结果:插入成功
没有进行事务的管理;我们想让他们都成功才成功,有一个失败,就都失败,我们就应该需要事务!
以前我们都需要自己手动管理事务,十分麻烦!
但是Spring给我们提供了事务管理,我们只需要配置即可;
13.1、spring中的事务管理
- 声明式事务:AOP
- 编程式事务:需要在代码中进行事物的管理
在这里使用的是声明式事务,实现的方式是AOP
-
在spring配置文件中导入约束
xmlns:tx="http://www.springframework.org/schema/tx" http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd"
-
开启 Spring 的事务处理功能
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/> </bean>
-
配置事务通知
<!--结合AOP 实现事务的织入--> <!--配置事务的通知--> <tx:advice id="txAdvice" transaction-manager="transactionManager"><!--给哪些方法配置事务--><!--配置事务的传播特性--><tx:attributes><tx:method name="add" propagation="REQUIRED"/><tx:method name="delete" propagation="REQUIRED"/><tx:method name="update" propagation="REQUIRED"/><tx:method name="query" read-only="true"/><tx:method name="*" propagation="REQUIRED"/></tx:attributes> </tx:advice>
-
配置AOP织入事务
<aop:config><aop:pointcut id="txPointCut" expression="execution(* com.kuang.mapper.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/> </aop:config>
-
删掉刚插入的数据,再次测试
public class MyTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");UserMapper userMapper = context.getBean("userMapper", UserMapper.class);List<User> userList = userMapper.selectUser();for (User user : userList) {System.out.println(user);}} }
思考:
为什么需要事务?
- 如果不配置事务,可能存在数据提交不一致的情况;
- 如果我们不在Spring中去配置声明式事务,我们就需要在代码中手动配置事务!
- 事务在项目的开发中十分重要,涉及到数据的一致性和完整性问题,不容马虎