老师,我添加了事务还是会把商品的分类变为空
package com.imooc.service.impl; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import com.imooc.dao.CategoryDao; import com.imooc.dao.ProductDao; import com.imooc.dao.impl.CategoryDaoImpl; import com.imooc.dao.impl.ProductDaoImpl; import com.imooc.domain.Category; import com.imooc.domain.Product; import com.imooc.service.CategoryService; import com.imooc.utils.JDBCUtils; public class CategoryServiceImpl implements CategoryService { @Override public List<Category> findAll() { //调用CategoryDao的方法 System.out.println("CategoryService的findAll方法执行了"); CategoryDao categoryDao=new CategoryDaoImpl(); return categoryDao.findAll(); } @Override public void save(Category category) { CategoryDao categoryDao=new CategoryDaoImpl(); categoryDao.save(category); } @Override public Category findOne(Integer cid) { CategoryDao categoryDao=new CategoryDaoImpl(); return categoryDao.findOne(cid); } @Override public void update(Category category) { CategoryDao categoryDao=new CategoryDaoImpl(); categoryDao.update(category); } @Override public void delete(Integer cid) { /** * 事务管理:在业务层统一创建连接对象,保证对个DAO中使用同一个连接 * *1.创建连接之后,将连接对象传递给DAO * *2.创建一个连接对象,将连接绑定到当前线程中(ThreadLocal) */ Connection conn=null; try { conn=JDBCUtils.getConnection(); //开启事务: conn.setAutoCommit(false); //要在删除分类之前,先将所属该分类的商品先处理一下 ProductDao productDao=new ProductDaoImpl(); List<Product> list=productDao.findByCid(cid); for(Product product:list) { product.getCategory().setCid(null); productDao.update(conn,product); } int d=1/0; //删除分类: CategoryDao categoryDao=new CategoryDaoImpl(); categoryDao.delete(conn,cid); //提交事务: conn.commit(); }catch(Exception e) { //回滚事务: try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); }finally { if(conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
为什么商品分类还是会变空呢,分类没有变
9
收起
正在回答
2回答
同学你好。
1、事务回滚是指的是将开启事务后的,也就是conn.setAutoCommit(false);之后的所有数据库操作回滚。所以productDao.update(conn,product);会失效,也就是相关的product的数据中cid并没有改变为null。可以理解是"product.getCategory().setCid(null);"也回滚
2、同学的测试方法是否和老师视频中的一致呢?将同学贴的代码放入老师源码中,使用视频中的方式重新进行了测试,报了除以0异常,并且事务正常回滚,风景画分类仍然存在,cid为2的product也没有变为null哦~
同学可以开启debug模式,分别在conn.setAutoCommit(false); int d=1/0;打一下断点,看一下在开启事务前是否已经发生了异常,或者对异常是否进行了其他捕获导致其没有进行conn.rollback();
祝学习愉快~
慕UI5285863
2019-10-06 04:12:42
回滚事务也包括把"product.getCategory().setCid(null);"这句话也回滚吗?但是出现异常商品分类还是为空
3. Java 数据库开发与实战应用
- 参与学习 人
- 提交作业 357 份
- 解答问题 8016 个
本阶段将带你学习MySQL数据库,JDBC接口,MyBatis框架等,带你掌握的数据的存放和管理。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星