Spring 事物

千山我独行,不必相送...
Angi For Ever
Spring管理iBatis事务

<sqlMapConfig>
<sqlMap resource="com/angi/ibatis/maps/User.xml" />
</sqlMapConfig>
以上配置省去了transactionManager的配置,就会使用external(外部)事务管理(ExternalTransaction),即等同如下配置:
复制代码
<sqlMapConfig>
<transactionManager type="EXTERNAL">
<!--这个数据源其实没有什么意义,还是取上面的省略方式吧-->
<dataSource type="DBCP">
</dataSource>
</transactionManager>
<sqlMap resource="com/angi/ibatis/maps/User.xml" />
</sqlMapConfig>
复制代码
1、TransactionProxyFactoryBean
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">
<!-- DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<!--<property name="defaultAutoCommit" value="false"/>-->
<property name="url">
<value>jdbc:mysql://localhost/test</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>mysql</value>
</property>
</bean>
<!-- Spring iBatis Template -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<bean id="userDAO" class="com.angi.ibatis.dao.UserDaoImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
<bean id="userService" class="com.angi.ibatis.service.UserService">
<property name="userDao">
<ref bean="userDAO" />
</property>
</bean>
<bean id="userServiceProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="userService" />
</property>
<property name="transactionAttributes">
<props>
<!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 -->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
复制代码
2、TransactionInterceptor
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">
<!-- DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<!--<property name="defaultAutoCommit" value="false"/>-->
<property name="url">
<value>jdbc:mysql://localhost/test</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>mysql</value>
</property>
</bean>
<!-- Spring iBatis Template -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<bean id="userDAO" class="com.angi.ibatis.dao.UserDaoImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
<bean id="userService" class="com.angi.ibatis.service.UserService">
<property name="userDao">
<ref bean="userDAO" />
</property>
</bean>
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>userService</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 -->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
复制代码
3、AOP和TX配置
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">
<!-- DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost/test</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>mysql</value>
</property>
</bean>
<!-- Spring iBatis Template -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 需要引入aop的命名空间 -->
<aop:config>
<!-- 切入点指明了在所有方法产生事务拦截操作 -->
<aop:pointcut id="serviceMethods"
expression="execution(* com.angi.ibatis.service.*.*(..))" />
<!-- 定义了将采用何种拦截操作,这里引用到 txAdvice -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>
<!-- 需要引入tx的命名空间 -->
<!-- 这是事务通知操作,使用的事务管理器引用自 transactionManager -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 指定哪些方法需要加入事务,这里懒惰一下全部加入,可以使用通配符来只加入需要的方法 -->
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<bean id="userDAO" class="com.angi.ibatis.dao.UserDaoImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
<bean id="userService" class="com.angi.ibatis.service.UserService">
<property name="userDao">
<ref bean="userDAO" />
</property>
</bean>
</beans>
复制代码
4、anotation
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">
<!-- 需要引入tx的命名空间 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<!--<property name="defaultAutoCommit" value="false"/>-->
<property name="url">
<value>jdbc:mysql://localhost/test</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>mysql</value>
</property>
</bean>
<!-- Spring iBatis Template -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<bean id="userDAO" class="com.angi.ibatis.dao.UserDaoImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
<bean id="userService" class="com.angi.ibatis.service.UserService">
<property name="userDao">
<ref bean="userDAO" />
</property>
</bean>
</beans>
复制代码
Java代码:
复制代码
@Transactional
public void doTransaction() {
User user = new User();
user.setName("11111");
user.setSex(1);
userDao.saveUser(user);
User user1 = new User();
user1.setName("Angikkk");
user1.setSex(1);
userDao.saveUser(user1);
复制代码
}

分类: iBatis, Spring
绿色通道: 好文要顶 关注我 收藏该文与我联系
Angi
关注 - 0
粉丝 - 5
+加关注
2 0
(请您对文章做出评价)
» 下一篇:Java安全领域组成部分
posted on 2011-04-07 10:28 Angi 阅读(8142) 评论(0) 编辑 收藏

刷新评论刷新页面返回顶部
(评论功能已被禁用)
博客园首页博问新闻闪存程序员招聘知识库

最新IT新闻:
· 微信群升级:人数允许超100人 需开通微信支付
· 苹果挖豪雅销售总监 为推出iWatch进行准备
· 我们反对无趣!来游戏化吧
· Linux 3.14将是下一个长期支持内核
· 研究发现人类不喜欢独自思考
» 更多新闻...
最新知识库文章:
· 程序员的自我修养(2)——计算机网络
· 你是否中了工程师文化的毒?
· 不安分的工程师
· 流量劫持——浮层登录框的隐患
· Amazon前技术副总裁解剖完美技术面试
» 更多知识库文章...
Powered by:
博客园
Copyright © Angi

导航
管理
搜索


随笔分类
《Java加密与解密的艺术》读书笔记(10)
文章分类
Agile(1)
Android(3)
Architecture(2)
CSS(3)
Database(5)
DB2(19)
Eclipse(9)
Flash(1)
FreeMarker(2)
Hibernate(2)
iBatis(2)
Java EE(10)
Java SE(22)
JavaScript(7)
JBoss(2)
jQuery(3)
LDAP(1)
Linux(5)
Maven(7)
Microsoft(2)
Oracle(1)
POI(1)
Security(15)
Spring(3)
Spring Batch(2)
Spring Batch Admin(4)
Spring Security(7)
SSO(2)
Struts1(2)
Struts2(1)
Tomcat(7)
Web(7)
### Spring事务管理配置与使用示例 Spring 事务管理通过声明式事务控制来简化开发,减少手动管理事务的复杂性。以下是一个完整的事务管理配置和使用的示例。 #### 配置事务管理器 在基于 XML 的配置中,可以使用 `JpaTransactionManager` 或 `DataSourceTransactionManager` 来管理事务。以下是使用 `DataSourceTransactionManager` 的配置示例[^5]: ```xml <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 开启事务注解支持 --> <tx:annotation-driven transaction-manager="transactionManager"/> ``` 如果使用 JPA,则可以配置 `JpaTransactionManager`: ```xml <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <!-- 开启事务注解支持 --> <tx:annotation-driven transaction-manager="transactionManager"/> ``` #### 使用 @Transactional 注解 在服务层方法上使用 `@Transactional` 注解来定义事务行为。以下是一个简单的事务管理示例[^4]: ```java @Service public class UserService { @Autowired private UserDao userDao; @Transactional public void createUser(User user) { userDao.createUser(user); if ("error".equals(user.getUsername())) { throw new RuntimeException("Simulated exception for rollback"); } } @Transactional public void updateUser(User user) { userDao.updateUser(user); if ("error".equals(user.getUsername())) { throw new RuntimeException("Simulated exception for rollback"); } } } ``` #### 事务传播行为 事务传播行为决定了当前事务与新事务之间的关系。例如,`Propagation.REQUIRED` 是默认值,表示如果有现有事务则加入该事务,否则创建一个新事务[^1]。 ```java @Transactional(propagation = Propagation.REQUIRED) public void requiredTransaction() { // 业务逻辑 } @Transactional(propagation = Propagation.REQUIRES_NEW) public void requiresNewTransaction() { // 新事务独立运行 } ``` #### 注意事项 1. **内部调用问题**:在同一类中调用被 `@Transactional` 注解的方法时,事务可能不会生效。这是因为 Spring AOP 动态代理无法拦截类内部的方法调用[^3]。 2. **异常处理**:只有未捕获的受检异常或运行时异常才会触发回滚,默认情况下,已捕获的异常不会导致事务回滚[^2]。 3. **只读事务**:对于只读操作,可以通过设置 `readOnly=true` 提高性能,避免不必要的锁[^1]。 ```java @Transactional(readOnly = true) public List<User> findAllUsers() { return userDao.findAll(); } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值