当前位置: 首页 > 知识库问答 >
问题:

Spring::@事务性不工作

终洛华
2023-03-14

我是一个新的Spring和学习的事务概念。无法使@Transactional工作。

用例:
当getEmployee()抛出RuntimeException时,员工和员工详细信息的数据插入应该回滚。但回滚没有发生。我使用的是Oracle数据库11g和spring 4.3.1版本。下面是正在运行的独立java代码。

Employee emp = new Employee("149518", "Mickey", "Mouse", "15 years", "tennis");

IEmployee empIntfc = (IEmployee)ctx.getBean("empService");
try {
        empIntfc.createEmployee(emp);
        empIntfc.createEmployeeDetails(emp);

        //Below will throw RunTime Exception
        empIntfc.getEmployee(2);

    }catch (Exception e ) {
        e.printStackTrace();

    } finally {
        ctx.close();    
    }
public class EmployeeService implements IEmployee {

private DataSource dataSource;
private JdbcTemplate jdbcTemplate;

public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
    jdbcTemplate = new JdbcTemplate(this.dataSource);
}
public JdbcTemplate getJdbcTemplate() {
    return jdbcTemplate;
}

@Override
@Transactional
public int createEmployee(Employee emp) {       

    String sql1 = "INSERT INTO TEST_T1(EMP_ID, EMP_FNAME, EMP_LNAME) values   
    (?,?,?)";
    return getJdbcTemplate().update(sql1, emp.getEmpId(), 
    emp.getEmpFirstName(), emp.getEmpLastName());
}

@Override
@Transactional
public int createEmployeeDetails(Employee emp) {

    String sql = "INSERT INTO TEST_T2(EMP_ID, EXP, SKILLS) values (?,?,?)";     
    return getJdbcTemplate().update(sql, emp.getEmpId(), emp.getExp(), 
    emp.getSkills());
}

@Override
@Transactional(readOnly = true, noRollbackFor=RuntimeException.class)
public Employee getEmployee(int empId) {
    throw new RuntimeException("Intentional runtime exception");
}
<beans xmlns="http://www.springframework.org/schema/beans">

<context:annotation-config/>
<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager" 
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource"   
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"  >
  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
  <property name="url" value="jdbc:oracle:thin:@//xxxx:1521/xxxx"/>
  <property name="username" value="user"/>
  <property name="password" value="user"/>
  </bean> 
  <bean id="empService" class="com.service.EmployeeService">
  <property name="dataSource" ref="dataSource"/>
  </bean>   
  </beans>

共有1个答案

祁鸿晖
2023-03-14

您的主要方法不是事务性的...意思是:输入“create employee”创建一个新事务并提交它,“create employeeDetails”创建一个新事务并提交它。

 类似资料:
  • 嗨,我正在尝试开发带有事务的spring和hibernate应用程序,我正在使用Spring4。x和hibernate 4。下面是我的代码片段 应用程序上下文。xml servlet上下文。xml 坚持。xml finnaly meservice看起来像这样 和 这里会发生运行时异常,但db记录没有回滚。

  • 我使用的是grails 1.3.7,代码如下: Grails服务: 我的例外: } 当代码抛出MyException时,我发现以下错误:事务回滚,因为它已被标记为仅回滚 注:如果我更改static transactional=true,则不会发生错误。 知道吗?

  • 我将Spring 3.2.4与JavaFX结合使用,并希望实现一种方法,其中操作将在事务中执行。我在控制器中的代码如下所示: 以及我的应用程序上下文: 尝试运行时,我收到以下错误消息: 该方法存在。删除注释,或者将方法从public更改为private,或者从配置中删除bean,程序就会运行,但事务注释根本不起作用。删除代理目标会导致另一个错误。

  • 我试图通过在一个事务中运行多个save方法来原子化地保存许多实体,因此如果其中任何一个方法失败,所有这些方法都将被丢弃(回滚)。我尝试了很多方法,但似乎没有什么效果: BookingResource。java: ReservationRepository。java: Reservation.java: stacktrace是: 那么,这里发生了什么?我如何解决它?我试图公开这些方法,更改事务策略,

  • 问题出在@Transactional中,在我的配置中spring应用程序没有使用它。我怎么能修好它? ...REST控制器没有任何事务性方法,它只使用specifiedServices加载实体。依赖集合(如果未加载到服务中)应为空。 应用程序启动程序类: 我还尝试将@Transactional添加到存储库接口中,但对我来说并不起作用 所以我从存储库中删除了@Transactional,创建了其他服