2017-06-17 54 views
0

我有以下場景,我有2個服務層負責將數據插入emp表和dept表。Spring傳播requires_new不起作用

我已經寫了查詢失敗插入的部門表,即deptno無法接受長度> 2的deptno,因此它不會插入數據庫由於DataIntegrity違反。我不希望我以前的交易依賴於此交易。因此使用了REQUIRES_NEW傳播級別。

這是我的代碼。

@Component 
public class EmployeeServiceImpl implements EmployeeService { 

    @Autowired 
    private EmployeeDao employeeDao; 

    @Autowired 
    private DeptService deptService; 

    @Transactional(propagation = Propagation.REQUIRED) 
    public boolean createEmployee() { 
     employeeDao.insertEmployee(); 
     deptService.createDept(); 
     return false; 
    } 
} 

@Component 
public class DeptServiceImpl implements DeptService { 

    @Autowired 
    private DeptDao deptDao; 

    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    public boolean createDept() { 
     deptDao.insertDepartment(); 
     return false; 
    } 
} 

下面是DAO層

@Component 
public class EmployeeDaoImpl implements EmployeeDao { 

    private String empInsert = "INSERT INTO emp VALUES ('1000','Ravi','CLERK','7782','1990-01-01','1235.00',NULL,'50');"; 

    @Autowired 
    private JdbcTemplate jdbcTemplate; 

    public boolean insertEmployee() { 

     int n = jdbcTemplate.update(empInsert); 
     return true; 
    } 
} 

@Component 
public class DeptDaoImpl implements DeptDao { 

    private String deptInsert = "INSERT INTO dept VALUES ('500','MATERIAL','ALASKA');"; 

    @Autowired 
    private JdbcTemplate jdbcTemplate; 

    public boolean insertDepartment(){ 
     jdbcTemplate.update(deptInsert); 
     return true; 
    } 

} 

下面的代碼是從主類稱爲

public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("txrequirednew.xml"); 
     EmployeeService es = (EmployeeService) context.getBean("employeeServiceImpl"); 
     es.createEmployee(); 
    } 

下面是我的應用程序上下文:

<beans> 

    <context:annotation-config/> 
     <context:component-scan base-package="txrequirednew"> 
    </context:component-scan> 

     <bean id="dataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource"> 
      <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
      <property name="url" value="jdbc:mysql://localhost:3306/tejadb"></property> 
      <property name="username" value="root"/> 
      <property name="password" value="sai"/> 
     </bean> 

     <!-- Dao Configurations--> 
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
      <property name="dataSource" ref="dataSource"/> 
     </bean> 

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

     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
      <property name="dataSource" ref="dataSource" /> 
     </bean> 

    </beans> 

當我嘗試執行,這兩個transa ctions正在回滾。但我不想讓我的第一筆交易回滾。

這是什麼我在這裏失蹤,這導致兩個交易回滾? 我該如何解決這個問題。

回答

0

你說得對有關事務範圍如果REQUIRES_NEW傳播內TRANSATION回滾因爲

PROPAGATION_REQUIRES_NEW對於給定的範圍內啓動一個新的,獨立的「內部」事務,不應影響外TRANSATION。這個事務將被完全獨立於外部事務提交或回滾,具有其自己的隔離範圍,自己的一組鎖等。外部事務將在內部事務的開始處被暫停,並且一旦內部事務處理完成。 ...

但是,如果你沒有處理它們,你應該處理你的內部方法拋出它的異常將回滾外部事務。 Spring框架事務將僅回滾RunTimeException對於其他檢查過的異常(如SqlException)。

+0

謝謝A.R Afsharian。它爲我工作。 – user3777919