Transaction之坑:Spring中配置Transaction与不配置有何区别

1,743 阅读1分钟

首先

Spring中 Transaction管理 配置有两种方式:

  • Annotation式:@Transactional
  • Xml式:<tx:method />

Note: 以下所有讨论,都是用 @Transactional 方式来 开启Transaction支持


问题

  1. 什么样的mehtod需要配置注解 @Transactional
  2. method 没有配置注解 @Transactional, 难道 sql操作 就不会被 commit

解决

  1. 配置@Transactional的目的就是手动开启事务,保证method中一系列sql操作包含在同一事务中,从保证数据的完整性(回滚或提交)与读写安全(隔离级别);

  2. DataSource缺省 配置: defaultAutoCommit=true;

即: 如果method不配置 @Transactional ,则每执行一个 SQL操作,如果成功,默认开启的事务就会 立即 向数据库自动commit,而不能rollback

  1. 为了维护 数据库的完整性,保证成批的 SQL 语句要么全部 commit,要么全部 rollback。通常包含以下两种方式:
    • BEGIN, ROLLBACK, COMMIT来实现,显式地开启并控制一个Transaction
    • 执行命令SET AUTOCOMMIT=0,用来 禁止 当前会话自动commit

method上配置注解@Transactional,就是使用第一种方式来实现Transaction管理 基于SpringAOP实现方法增强,这里表现为TransactionAspectSupport