老师,我添加了事务还是会把商品的分类变为空
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 星