Java spring@Transaction不使用两个表回滚
它涉及一个事务中两个表的插入操作。在例外情况下 事务没有回滚。事务在第一个事务中启动,下一个dao调用在同一会话中继续。设置了回滚异常模式,但它仍然不是回滚。有人能帮忙吗 Pom相关性:Java spring@Transaction不使用两个表回滚,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,它涉及一个事务中两个表的插入操作。在例外情况下 事务没有回滚。事务在第一个事务中启动,下一个dao调用在同一会话中继续。设置了回滚异常模式,但它仍然不是回滚。有人能帮忙吗 Pom相关性: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId&g
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.1.9.Final</version>
</dependency>
</dependencies>
不要关闭会话。那是斯普林的工作。不需要刷新它。调用这两个方法的代码是什么?它是否启动了一个事务?@user3314249似乎有两个独立的事务,一个可能正在回滚,但第二个可能不会,发布更多的代码、调用方法等。
<tx:annotation-driven transaction-manager="transactionManager" />
<context:component-scan base-package="com.byteslounge.spring.tx.dao.impl" />
<context:component-scan base-package="com.byteslounge.spring.tx.user.impl" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@org-e0a6b74ade3:1521:XE" />
<property name="username" value="system" />
<property name="password" value="password" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
</props>
</property>
<property name="packagesToScan" value="com.byteslounge.spring.tx.model" />
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory">
<property name="nestedTransactionAllowed" value="true" />
</bean>
</beans>
@Repository
public class AddressDaoImpl implements AddressDao{
@Autowired
private SessionFactory sessionFactory;
@Transactional(propagation=Propagation.MANDATORY ,
rollbackFor={MyEx1.class,Exception.class,org.hibernate.HibernateException.class})
public void insertAddress(Address address) {
Session session = sessionFactory.getCurrentSession();
System.out.println("session>>>>>>>>>>>>>>>>>>>>>>>>>>3* "+ session.hashCode());
session.save(address);
session.flush();
}
}
@Transactional(propagation=Propagation.REQUIRES_NEW,
rollbackFor={MyEx1.class,Exception.class,org.hibernate.HibernateException.class})
public void insertUser(User user, Address address) throws MyEx1 {
Session session = sessionFactory.getCurrentSession();
System.out.println("session>>>>>>>>>>>>>>>>>>>>>>>>>>2* "+ session.hashCode());
session.save(user);
addressDao.insertAddress(address);
session.flush();
session.close();
throw new MyEx1("User inserted!");
//session.getTransaction().commit();
//session.close();
}