1.配置mybatis的事物,配置类加上开启事物注解@EnableTransactionManagement
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration
//开启事物
@EnableTransactionManagement
public class MybatisConfig {
//配置事物
//通过ioc注入DataSource
public DataSourceTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
2.在需要用到的地方加入注解 @Transactional这样就好了
@Service
public class BillService {
@Autowired
BillItemDao billItemDao;
@Autowired
BillMasterDao billMasterDao;
@Transactional
public Integer insert(BillMasterDto billMasterDto) {
BillMaster master = new BillMaster();
/*单据编号*/
master.setBillNo("R" + DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss"));
master.setBillDate(billMasterDto.getBillDate());
master.setVendorId(billMasterDto.getVendorId());
master.setLastUpdateBy(CurrUserThreadLocal.get().getUserId());
master.setLastUpdateTime(LocalDateTime.now());
billMasterDao.insert(master);
List<BillItemDto> products = billMasterDto.getProducts();
for (BillItemDto product : products) {
BillItem item = new BillItem();
item.setProductId(product.getProductId());
item.setQty(product.getQty());
item.setMasterId(master.getId());
item.setLastUpdateBy(CurrUserThreadLocal.get().getUserId());
item.setLastUpdateTime(LocalDateTime.now());
billItemDao.insert(item);
}
return 1;
}
}
3.解决办法 模拟事物失效,自己调自己this
//模拟事物失效,自己调自己this
@Transactional
public void insert2(BillMasterDto billMasterDto) {
BillMaster master = new BillMaster();
master.setBillNo("R" + DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss"));
master.setBillDate(billMasterDto.getBillDate());
master.setVendorId(billMasterDto.getVendorId());
master.setLastUpdateBy(CurrUserThreadLocal.get().getUserId());
billMasterDao.insert(master);
List<BillItemDto> products = billMasterDto.getProducts();
int i = 1;
for (BillItemDto product : products) {
BillItem item = new BillItem();
item.setProductId(product.getProductId());
item.setQty(product.getQty());
item.setMasterId(master.getId());
item.setLastUpdateBy(CurrUserThreadLocal.get().getUserId());
billItemDao.insert(item);
i++;
}
}
public Integer insert1(BillMasterDto billMasterDto) {
//this1 BillService对象本身,没有被封装.
BillService this1 = this;
//直接调用,事务不生效
this1.insert2(billMasterDto);
//this2 封装后的代理对象.
//AopContext.currentProxy()加上下文代理
BillService this2 = (BillService) AopContext.currentProxy();
//调用,事务生效
this2.insert2(billMasterDto);
return 1;
}