关于Java web开发中的MySQL的事务语句

在Java web中MySQL的的语句经常可能要执行几次,而这几次我们想包装成一个事务,很多人可能会通过在XML中配置事务,或者直接通过注解@Transaction来实现。

举个栗子:

@Transactional
public void updateProjectStatusByBpmCode(String bpmCode, MjProjectsStatusEnum mjProjectsStatusEnum) {
    log.info("do something 1");
    int updateAffectNum = manageProjectAuditMapper.updateProjectStatusByBpmCode(bpmCode, mjProjectsStatusEnum.getIndex());
    log.info("do something 2");
    int updateAffectNum2 = manageProjectAuditMapper.updateProjectStatusByBpmCode(bpmCode, 77);
    log.info("do something 3");
}
这里在方法upadteProjectsStatusByBpmCode中进行两次数据库的更改操作,为了保证事务性,在方法上面加入注解@Transaction。观察log语句和mysql输出语句如下:
2018-05-13 13:58:25.158 INFO 20180513135818BGVNy41JzOE3Hhqk9t2 (ManageProjectService.java:48) - do something 1
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@e141a5e]
JDBC Connection [com.mysql.jdbc.JDBC4Connection@7f4809db] will be managed by Spring
==> Preparing: UPDATE mj_projects SET status = ? WHERE bpm_code = ?;
==> Parameters: 2(Integer), HU1805110000153(String)
<== Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@e141a5e]
2018-05-13 13:58:33.728 INFO 20180513135818BGVNy41JzOE3Hhqk9t2 (ManageProjectService.java:50) - do something 2
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@e141a5e] from current transaction
==> Preparing: UPDATE mj_projects SET status = ? WHERE bpm_code = ?;
==> Parameters: 77(Integer), HU1805110000153(String)
<== Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@e141a5e]
2018-05-13 13:58:39.200 INFO 20180513135818BGVNy41JzOE3Hhqk9t2 (ManageProjectService.java:52) - do something 3
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@e141a5e]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@e141a5e]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@e141a5e]
可以发现:
log.info("do something 1")是第一句进行执行的,然后,mysql才开始创建连接,而不是之前就创建事务的。
注解@Transaction发起事务的时机是在第一次执行MySQL语句,事务的提交是在方法的结束进行提交。
因此,建议, 最好在第一条MySQL语句执行前,能处理的java代码先进行处理,而不要将无关紧要的代码夹杂在MySQL执行语句之中
改进上述代码(如果log.info("do something 2")可以提前执行的话):
@Transactional
public void updateProjectStatusByBpmCode(String bpmCode, MjProjectsStatusEnum mjProjectsStatusEnum) {
    log.info("do something 1");
    log.info("do something 2");
    int updateAffectNum = manageProjectAuditMapper.updateProjectStatusByBpmCode(bpmCode, mjProjectsStatusEnum.getIndex());
    int updateAffectNum2 = manageProjectAuditMapper.updateProjectStatusByBpmCode(bpmCode, 77);
    log.info("do something 3");
}

猜你喜欢

转载自blog.csdn.net/timchen525/article/details/80315063