8244 发表于 2016-11-25 02:38:49

Spring+Mybatis 手动控制事务

@Override
   public boolean testDelete(String jobCode) throws Exception {
      boolean flag = false;
      //1.获取事务控制管理器
      DataSourceTransactionManager transactionManager = HqznContext.getBean(
           "transactionManager", DataSourceTransactionManager.class);
      //2.获取事务定义
      DefaultTransactionDefinition def = new DefaultTransactionDefinition();
      //3.设置事务隔离级别,开启新事务
      def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
      //4.获得事务状态
      TransactionStatus status = transactionManager.getTransaction(def);
      try {
        //5.具体的数据库操作(多个)
        BOBaseJob r = new BOBaseJob();
        r.setJobCode("SW001");
        r.setJobName("事务001");
        BOBaseJobMapper.deleteByPrimaryKey(jobCode);
        BOBaseJobMapper.insert(r);
        flag = true;
        transactionManager.commit(status);
      } catch (Exception e) {
        transactionManager.rollback(status);
      }
      return flag;
   }
 
结合日志分析:
 
 

(1)获取Mybatis下的sqlSession
DEBUG:  - Creating SqlSession with JDBC Connection 

DEBUG:  - ooo Connection Opened


(2)Spring控制事务
DEBUG:  - JDBC Connection  will be managed by Spring


(3)事务开启
DEBUG:  - Registering transaction synchronization for SqlSession 


DEBUG:  - ==>  Executing: update BASE_JOB set FLAG_YN = 'N' where JOB_CODE = ? 
DEBUG:  - ==> Parameters: 10(String)


(4)释放SqlSession
DEBUG:  - Releasing transactional SqlSession 


(5)获取当前事务
DEBUG:  - Fetched SqlSession  from current transaction

DEBUG:  - ==>  Executing: insert into BASE_JOB (JOB_CODE, JOB_NAME, CREATE_PERSON, FLAG_YN, MODIFY_PERSON, CREATE_TIME, MODIFY_TIME) values (?, ?, ?, 'Y', ?, ?, ?) 
DEBUG:  - ==> Parameters: SW001(String), 事务001(String), null, null, null, null
 
异常信息:
DEBUG:  - {conn-10002, pstmt-20007} enter cache
INFO :  - Loading XML bean definitions from class path resource 
INFO :  - SQLErrorCodes loaded: 
DEBUG:  - Releasing transactional SqlSession 
事务回滚:
### Error updating database.  Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 违反了 PRIMARY KEY 约束“PK_BASE_JOB”。不能在对象“dbo.BASE_JOB”中插入重复键。重复键值为 (SW001)。
### The error may involve com.hqzn.mybatis.dao.interfaces.BOBaseJobMapper.insert-Inline
### The error occurred while setting parameters
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 违反了 PRIMARY KEY 约束“PK_BASE_JOB”。不能在对象“dbo.BASE_JOB”中插入重复键。重复键值为 (SW001)。
; SQL []; 违反了 PRIMARY KEY 约束“PK_BASE_JOB”。不能在对象“dbo.BASE_JOB”中插入重复键。重复键值为 (SW001)。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 违反了 PRIMARY KEY 约束“PK_BASE_JOB”。不能在对象“dbo.BASE_JOB”中插入重复键。重复键值为 (SW001)。
 
(6)释放SqlSession
DEBUG:  - Releasing transactional SqlSession 
DEBUG:  - Transaction synchronization closing SqlSession 
页: [1]
查看完整版本: Spring+Mybatis 手动控制事务