Spring 事務管理透過 PlatformTransactionManager 介面實現,JDBC 環境使用 DataSourceTransactionManager,無需 Hibernate。
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
@Service
public class UserService {
@Autowired private JdbcTemplate jdbcTemplate;
@Transactional
public void transfer(String from, String to, double amount) {
jdbcTemplate.update("UPDATE account SET balance=balance-? WHERE name=?", amount, from);
jdbcTemplate.update("UPDATE account SET balance=balance+? WHERE name=?", amount, to);
}
}
struts2-spring-plugin,Action 由 Spring 管理,注入 Service。<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="transfer" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="*" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>
@Transactional 僅對 public 方法生效,內部呼叫不觸發代理。RuntimeException,需 rollbackFor = Exception.class 捕獲受檢異常。autoCommit=false (Spring 會自動處理)。