1. Transaksi musim bunga tidak akan ditarik balik Saya telah mencuba semua kaedah dalam talian tetapi tidak berjaya.
2. Konfigurasi adalah seperti berikut:
<context:component-scan base-package="com.szcshl">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<context:component-scan base-package="com.szcshl" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 配置事务管理器 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 注解方式配置事物 -->
<!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->
<!-- 拦截器方式配置事物 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" />
<tx:method name="save*" />
<tx:method name="update*" />
<tx:method name="modify*" />
<tx:method name="edit*" />
<tx:method name="delete*" />
<tx:method name="remove*" />
<tx:method name="repair" />
<tx:method name="deleteAndRepair" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="load*" propagation="SUPPORTS" read-only="true" />
<tx:method name="search*" propagation="SUPPORTS" read-only="true" />
<tx:method name="datagrid*" propagation="SUPPORTS" read-only="true" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="transactionPointcut" expression="execution(* com.szcshl.service..*Impl.*(..))" />
<aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
</aop:config>
@RequestMapping(value = "/Save" , method= RequestMethod.POST)
public void departmentSave(Department department, HttpServletResponse response){
departmentService.save(department);
throw new RuntimeException("抛出异常");
}
@Service
@Transactional
public class DepartmentServiceImpl extends BaseServiceImpl<Department> implements DepartmentService {
@Autowired
private DepartmentDao deptDao;
......
public void save(Department entity) {
deptDao.save(entity);
}
}
public class BaseDaoImpl<T> implements BaseDao<T> {
private SessionFactory sessionFactory;
protected Class<T> entityClass;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
@Resource
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session getCurrentSession() {
return this.sessionFactory.getCurrentSession();
}
@SuppressWarnings("rawtypes")
protected Class getEntityClass() {
if (entityClass == null) {
entityClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
return entityClass;
}
@Transactional
public Serializable save(T entity) {
return this.getCurrentSession().save(entity);
}
......
}
Melihat padanya, anda menguruskan urus niaga pada antara muka perkhidmatan, bukan pengawal
Pengecualian yang anda lemparkan adalah dalam pengawal, sudah tentu transaksi tidak akan ditarik balik
Anda cuba menyimpannya dalam kelas pelaksanaan perkhidmatan dan kemudian membuang pengecualian untuk melihat sama ada simpanan berjaya atau tidak
PS: mysql mempunyai dua enjin storan (biasa digunakan), satu ialah InnoDB dan satu lagi ialah MyISAM yang pertama menyokong kunci peringkat baris, transaksi dan kunci asing, manakala yang kedua tidak menyokong
.Apa yang anda katakan di atas adalah betul Transaksi musim bunga bertindak pada lapisan perkhidmatan Apabila kaedah perkhidmatan mengeluarkan pengecualian, transaksi akan ditarik balik. Jadi amalan ujian anda yang betul ialah membuang pengecualian dalam kaedah lapisan perkhidmatan.