您的位置:首页 > 编程语言 > Java开发

Spring+Mybatis 手动控制事务

2017-03-19 22:50 441 查看
@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: [org.mybatis.spring.SqlSessionUtils.(28)debug] - Creating SqlSession with JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@64861c5d]

DEBUG: [java.sql.Connection.(28)debug] - ooo Connection Opened

(2)Spring控制事务

DEBUG: [org.mybatis.spring.transaction.SpringManagedTransaction.(28)debug] - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@64861c5d] will be managed by Spring

(3)事务开启

DEBUG: [org.mybatis.spring.SqlSessionUtils.(28)debug] - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@eed9a0e]

DEBUG: [java.sql.PreparedStatement.(28)debug] - ==>  Executing: update BASE_JOB set FLAG_YN = 'N' where JOB_CODE = ? 

DEBUG: [java.sql.PreparedStatement.(28)debug] - ==> Parameters: 10(String)

(4)释放SqlSession

DEBUG: [org.mybatis.spring.SqlSessionUtils.(28)debug] - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@eed9a0e]

(5)获取当前事务

DEBUG: [org.mybatis.spring.SqlSessionUtils.(28)debug] - Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@eed9a0e] from current transaction

DEBUG: [java.sql.PreparedStatement.(28)debug] - ==>  Executing: insert into BASE_JOB (JOB_CODE, JOB_NAME, CREATE_PERSON, FLAG_YN, MODIFY_PERSON, CREATE_TIME, MODIFY_TIME) values (?, ?, ?, 'Y', ?, ?, ?) 

DEBUG: [java.sql.PreparedStatement.(28)debug] - ==> Parameters: SW001(String), 事务001(String), null, null, null, null

 

异常信息:

DEBUG: [com.alibaba.druid.pool.PreparedStatementPool.(123)put] - {conn-10002, pstmt-20007} enter cache

INFO : [org.springframework.beans.factory.xml.XmlBeanDefinitionReader.(317)loadBeanDefinitions] - Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]

INFO : [org.springframework.jdbc.support.SQLErrorCodesFactory.(126)<init>] - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana]

DEBUG: [org.mybatis.spring.SqlSessionUtils.(28)debug] - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1d595930]

事务回滚:

### 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: [org.mybatis.spring.SqlSessionUtils.(28)debug] - Releasing transactional SqlSession [o
94c9
rg.apache.ibatis.session.defaults.DefaultSqlSession@eed9a0e]

DEBUG: [org.mybatis.spring.SqlSessionUtils.(28)debug] - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSessio
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mybatis