【问题标题】:Boundary of spring transactionspring事务的边界
【发布时间】:2015-08-06 00:57:48
【问题描述】:

我有两个春季服务。非事务性的 Service1.foo() 调用事务性的 Service2.bar()。所以我想知道我的交易是否仅限于 service2.bar()。我想确保 Service1.foo() 不在事务中运行。我的代码正确吗?

class Service1 
{
    public void foo() {
        //some non transaction code
        service2.bar();
        //some non transaction code
    }
}

@Transactional
class Service2 
{
    public void bar() {
        //TODO;
    }
}

【问题讨论】:

    标签: java spring transactions


    【解决方案1】:

    是的。 如果您正确设置了事务支持并且您为@Transactional 使用了正确的导入 (org.springframework.transaction.annotation.Transactional),那么只有 Service2 中的方法在事务中运行,而 Service1 中的方法不运行。

    如果设置不正确,则事务中不会运行任何内容。

    【讨论】:

      【解决方案2】:

      是的,您的代码将适用于您提到的场景。请参阅下面的代码示例,执行后,只有 1 条记录插入到 TEST_TABLE 中,CD=INSERT3。我在来自 Dao2impl 的插入中放入了错误的列,导致事务失败。

      下面是 Service1 类,我从中调用 insertMainServiceCall 方法,该方法调用了需要在事务中执行的 insertData 方法:

      @Service
      public class Service1 {
      
      @Autowired
      private Service2 service2;
      
      @Autowired
      private DataSource datasource;
      private JdbcTemplate jdbcTemplate;
      
      
      public Service2 getService2() {
          return service2;
      }
      
      public void setService2(Service2 service2) {
          this.service2 = service2;
      }
      
      
      public DataSource getDatasource() {
          return datasource;
      }
      
      public void setDatasource(DataSource datasource) {
          this.datasource = datasource;
      }
      
      public void insertMainServiceCall(){
          String sqlCmd="INSERT INTO   TEST_TABLE " +
                  "(CD, NAME, DEPT) VALUES (?, ?, ?)";
          jdbcTemplate = new JdbcTemplate(datasource);
      
          jdbcTemplate.update(sqlCmd, new Object[] {"INSERT3",
                  "INSERT3","INSERT3"  
          });
      
          service2.insertData();
      }
      

      }

      下面是我的 Service2 类:

      @Transactional
      @Service
      public class Service2 {
      
      @Autowired
      private Dao1 dao1;
      
      @Autowired
      private Dao2 dao2;
      
      public Dao1 getDao1() {
          return dao1;
      }
      
      public void setDao1(Dao1 dao1) {
          this.dao1 = dao1;
      }
      
      public Dao2 getDao2() {
          return dao2;
      }
      
      public void setDao2(Dao2 dao2) {
          this.dao2 = dao2;
      }
      
      public void insertData(){
          dao1.insert1();
          dao2.insert2();
      }
      
      }
      

      下面是我的 Dao1Impl 类代码:

      @Repository
      public class Dao1Impl implements Dao1{
      
      @Autowired
      private DataSource dataSource;
      private JdbcTemplate jdbcTemplate;
      
      
      public void insert1(){
          String sqlCmd="INSERT INTO   TEST_TABLE " +
                  "(CD, NAME, DEPT) VALUES (?, ?, ?)";
          jdbcTemplate = new JdbcTemplate(dataSource);
      
          jdbcTemplate.update(sqlCmd, new Object[] {"INSERT1",
                  "INSERT1","INSERT1"  
          });
      }
      
      
      public DataSource getDataSource() {
          return dataSource;
      }
      
      
      public void setDataSource(DataSource dataSource) {
          this.dataSource = dataSource;
      }
      

      }

      下面是我的 Dao2Impl 类代码:

      @Repository
      public class Dao2Impl implements Dao2 {
      
      @Autowired
      private DataSource dataSource;
      private JdbcTemplate jdbcTemplate;
      
      
      public void insert2(){
          String sqlCmd="INSERT INTO   TEST_TABLE " +
                  "(CD, NAME, DEPT1) VALUES (?, ?, ?)";
          jdbcTemplate = new JdbcTemplate(dataSource);
      
          jdbcTemplate.update(sqlCmd, new Object[] {"INSERT2",
                  "INSERT2","INSERT2"  
          });
      }
      
      
      public DataSource getDataSource() {
          return dataSource;
      }
      
      
      public void setDataSource(DataSource dataSource) {
          this.dataSource = dataSource;
      }
      
      
      }   
      

      在 spring-config.xml 中,您需要设置事务支持如下:-

      <tx:annotation-driven transaction-manager="txManager"/>
      <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      

      【讨论】:

        猜你喜欢
        • 2017-05-22
        • 2016-06-05
        • 1970-01-01
        • 2019-07-05
        • 2020-07-07
        • 2015-01-01
        • 2015-08-18
        • 2019-04-18
        • 2017-03-26
        相关资源
        最近更新 更多