19、(知识篇)Spring使用事务Transation

来源:互联网 发布:火绒 windows defender 编辑:程序博客网 时间:2024/05/17 12:47

/**

* spring事务管理:

* 1、指定transactionmanager

* <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

* <property name="dataSource"ref="dataSource"></property>

* </bean>

*

* 2.1、指定通过注解设置事务

* <tx:annotation-driven/>

*

*  2.2、指定通过xml设置事务

<!-- 

使用xml配置服务

1、使用tx:advice指定需要使用事务的方法

1、1可以指定方法/匹配方法/* 设置需要使用事务

2、需要用aop声明切点,然后配置事务advice-ref为事务advice关联

<tx:advice id="txad" transaction-manager="transactionManager">

<tx:attributes> <tx:method name="*"/></tx:attributes>

</tx:advice>

<aop:config>

<aop:pointcut expression="execution(*  com.spring.service.UserService.*(..))" id="userServiceTrancation"/>

<aop:advisor advice-ref="txad"pointcut-ref="userServiceTrancation"/>

</aop:config>-->

*

*

* 3、事务传播行为/隔离级别/设置回滚类/只读设置 (参考userservice

* @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED,readOnly=true,rollbackFor={Exception.class})

* @param args

*/



测试类:

package com.spring.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.spring.service.UserService;import com.spring.vo.User;public class Test {/** * spring事务管理: *  * 1、指定transactionmanager * <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> *<property name="dataSource" ref="dataSource"></property> *</bean> * *2.1、指定通过注解设置事务 *<tx:annotation-driven/> * *  2.2、指定通过xml设置事务 *  <!-- 使用xml配置服务1、使用tx:advice指定需要使用事务的方法1、1可以指定方法/匹配方法/* 设置需要使用事务2、需要用aop声明切点,然后配置事务advice-ref为事务advice关联<tx:advice id="txad" transaction-manager="transactionManager"><tx:attributes> <tx:method name="*"/> </tx:attributes></tx:advice><aop:config><aop:pointcut expression="execution(*  com.spring.service.UserService.*(..))" id="userServiceTrancation"/><aop:advisor advice-ref="txad" pointcut-ref="userServiceTrancation"/></aop:config> --> * * * 3、事务传播行为/隔离级别/设置回滚类/只读设置 (参考userservice) * @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED,readOnly=true,rollbackFor={Exception.class}) *  * @param args */public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = ctx.getBean(UserService.class);//修改userService.updateTwoUser(new User(1, "Flash", 1), new User(2, "SuperMan", 1));}}

持久层类:

package com.spring.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Isolation;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import com.spring.dao.UserDao;import com.spring.vo.User;@Servicepublic class UserService {@Autowiredprivate UserDao userDao;/** * 1、事务传播行为: *  默认propagation=Propagation.REQUIRED  *  例如执行两次修改,第一次修改成功,第二次修改失败,则都会视为失败 * 如果设置为:Propagation.REQUIRES_NEW 则外面事务会挂起 * 例如执行两次修改,第一次修改成功,第二次修改失败,则第一次会提交成功 *  * 2、事务隔离级别: * isolation:设置相关读只提交/脏读/幻读等值 *  * 4、只读: * readonly:如果事务只读操作,设置该值会相对提高性能 *  * 5、回滚: * noRollbackFor:(类) * noRollbackForClassName:(全类名)指定不回滚的异常 * rollbackFor:(指定回滚的异常) * rollbackForClassName * 例如 rollbackFor={Exception.class} *  * @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED,readOnly=true,rollbackFor={Exception.class}) */@Transactionalpublic void updateTwoUser(User user1,User user2){int row = userDao.updateUser(user1);System.out.println("row == "+row);user2.setSex(user2.getSex()/0);int row2 = userDao.updateUser(user2);System.out.println("row2 == "+row2);}}

package com.spring.dao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.stereotype.Repository;import com.spring.vo.User;@Repositorypublic class UserDao {@Autowiredprivate JdbcTemplate template;/** * 更新 * @param user * @return */public int updateUser(User user){String sql = " update User set userName = ? ,sex = ? where id = ? ";return template.update(sql, user.getUserName(),user.getSex(),user.getId());}/** * 查找返回一个对象 * 采用queryForObject(String sql, RowMapper<User> rowMapper) * 需要传入RowMapper对象 * @param userId * @return */public User getUserById(int userId){String sql = " select * from User where id = ? ";RowMapper<User> userMapper = new BeanPropertyRowMapper<>(User.class);return template.queryForObject(sql, userMapper,userId);}}

package com.spring.vo;import org.springframework.stereotype.Component;@Componentpublic class User {private int id;private String userName;private int sex;public User() {super();// TODO Auto-generated constructor stub}public User(int id, String userName, int sex) {super();this.id = id;this.userName = userName;this.sex = sex;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + ", sex=" + sex + "]";}}

applicationContext.xml

<?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:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"><context:component-scan base-package="com.spring"></context:component-scan><!-- 指定数据源配置properties --><context:property-placeholder location="classpath:db.properties"/><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${driverClass}" ></property><property name="jdbcUrl" value="${url}" ></property><property name="user" value="${userName}" ></property><property name="password" value="${password}"></property></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 指定用注解管理事务 --><tx:annotation-driven/><!-- 使用xml配置服务1、使用tx:advice指定需要使用事务的方法1、1可以指定方法/匹配方法/* 设置需要使用事务2、需要用aop声明切点,然后配置事务advice-ref为事务advice关联<tx:advice id="txad" transaction-manager="transactionManager"><tx:attributes>指定方法<tx:method name="updateTwoUser" propagation="REQUIRES_NEW"/> 匹配方法 <tx:method name="update*" /><tx:method name="*"/></tx:attributes></tx:advice><aop:config><aop:pointcut expression="execution(*  com.spring.service.UserService.*(..))" id="userServiceTrancation"/><aop:advisor advice-ref="txad" pointcut-ref="userServiceTrancation"/></aop:config> --></beans>

db.properties

driverClass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/TestuserName=rootpassword=root


0 0
原创粉丝点击