首先
Spring中 Transaction管理 配置有两种方式:
- Annotation式:
@Transactional - Xml式:
<tx:method />
Note: 以下所有讨论,都是用
@Transactional方式来开启Transaction支持。
问题
- 什么样的
mehtod需要配置注解@Transactional? method没有配置注解@Transactional, 难道sql操作就不会被commit?
解决
-
配置
@Transactional的目的就是手动开启事务,保证method中一系列sql操作包含在同一事务中,从保证数据的完整性(回滚或提交)与读写安全(隔离级别); -
DataSource的缺省配置: defaultAutoCommit=true;
即: 如果
method不配置@Transactional,则每执行一个 SQL操作,如果成功,默认开启的事务就会立即向数据库自动commit,而不能rollback;
- 为了维护
数据库的完整性,保证成批的 SQL 语句要么全部commit,要么全部rollback。通常包含以下两种方式:- 用
BEGIN,ROLLBACK,COMMIT来实现,显式地开启并控制一个Transaction。 - 执行命令
SET AUTOCOMMIT=0,用来禁止当前会话自动commit。
- 用
method上配置注解@Transactional,就是使用第一种方式来实现Transaction管理(基于SpringAOP实现方法增强,这里表现为TransactionAspectSupport) 。