我觉得自己写的不好,所以先贴一个写的好的帖子
感觉看完不用回来了。。。。
这是一个大佬写的的博客 : https://www.cnblogs.com/yixianyixian/p/8372832.html
第一:JavaEE 体系进行分层开发,事务处理位于业务层,Spring 提供了分层设计业务层的事务处理解决方
案。
第二:spring 框架为我们提供了一组事务控制的接口。具体在后面的第二小节介绍。这组接口是在
spring-tx-5.0.2.RELEASE.jar 中。
第三:spring 的事务控制都是基于 AOP 的,它既可以使用编程的方式实现,也可以使用配置的方式实现。我
们学习的重点是使用配置的方式实现。
Spring提供了一个事务管理器接口PlatformTransationManager
,该接口包含了三个方法:
- getTransation()//提交事务
- commit();//提交事务
- rollback();//回滚事务
在开发中,根据应用的技术不同,使用不同的实现类
SpringJDBC / iBatis:org.springframework.jdbc.datasource.DataSourceTransactionManager
Hibernate:org.springframework.orm.hibernate5.HibernateTransactionManager
Transactionmanager
是事务信息对象,定义了与事务信息相关的方法
获取事务对象名称
String getName()
获取事务隔离级别
int getIsolationLevel()
获取事务传播行为
int getPropagationBehavior()
获取事务超时时间
getTimeOut()
获取事务是否为只读
IsReadOnly()
TransactionManager的隔离级别和传播行为有固定的参数
隔离级别
ISOLATION_DEFAULT ---(数据库)默认基本
ISOLATION_READ_UNCOMMITTED ---可读取未提交的数据
ISOLATION_READ_COMMITTED --- 只能读取已提交的数据(oracle默认级别)
ISOLATION_REPEATABLE_READ --- 是否读取其他事务提交修改后的数据,解决不可重复读的问题(mysql默认级别)
ISOLATION_SERIALIZABLE --- 是否读取其他事务提交添加后的数据,解决幻影读问题
事务传播行为
REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选
择(默认值)
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常
REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
NEVER:以非事务方式运行,如果当前存在事务,抛出异常
NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作。
事务超时时间:默认-1
没有时间限制,以秒为单位
这个接口提供了事务的运行状态
flush();刷新事务
hasSavepoint();是否在存储点
isCompleted();是否完成
isNewTransaction();是否是新事务
isRollbackOnly();是否回滚事务
setRollbackOnly();设置事务回滚
首先最基本几件事:导入jar包/坐标,导入(xml)约束
spring-jdbc包,spring-tx包,aspectjweaver
如果需要测试,需要加上junit-4.12,spring-test
这个可以在文档里找到
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
真正与数据库交互的层
在准备dao之前应准备表的实体类[略]
dao层的接口,只写连个,其他的方法都类似
public interface IDeptDao {
List<Dept> findAll(Integer id);
void Update(Dept dept);
}
实现类继承JdbcDaoSupport
,减少代码冗余
public class DeptDaoImpl extends JdbcDaoSupport implements IDeptDao {
public List<Dept> findAll(Integer id) {
return null;
}
public void Update(Dept dept) {
int update = getJdbcTemplate().update("update dept set deptno= ? where dname = ‘a‘ ",dept.getDeptno());
System.out.println("更改后----"+update);
}
}
根据DAO层,准备Service层的接口
与实现类
接口
public interface IDeptSer {
List<Dept> findAll(Integer id);
void Update(Dept dept);
}
这里的实现类
直接调用对应的方法
public class DeptSerImpl implements IDeptSer {
private DeptDaoImpl deptDao;
public void setDeptDao(DeptDaoImpl deptDao) {
this.deptDao = deptDao;
}
public List<Dept> findAll(Integer id) {
return deptDao.findAll(id);
}
public void Update(Dept dept) {
deptDao.Update(dept);
dept.setDeptno(80);
// int k = 0/0;//手动制造异常
deptDao.Update(dept);
}
}
与数据库交互的写好了,现在就是配置了
配置数据源
<!--数据源-->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql:///test"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</bean>
配置dao
层和service
层
<!--dao层实现类-->
<bean id="deptDao" class="gx.dao.impl.DeptDaoImpl">
<property name="dataSource" ref="datasource"></property>
</bean>
<!--service层实现类-->
<bean id="ds" class="gx.ser.impl.DeptSerImpl">
<property name="deptDao" ref="deptDao"></property>
</bean>
终于到了重点了
配置时间到
配置步骤
配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"></property>
</bean>
配置事务管理器的通知引用事务管理器
配置事务的属性
<!--第二步-->
<tx:advice id="txAdcvice" transaction-manager="transactionManager">
<!--第三步-->
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
配置AOP切入点表达式
配置切入点表达式和事务通知的对应关系
<aop:config>
<!--第四步-->
<aop:pointcut id="pt1" expression="execution(* gx.ser.impl.*.*(..))"/>
<!--第五步-->
<aop:advisor advice-ref="txAdcvice" pointcut-ref="pt1"></aop:advisor>
</aop:config>
属性:name --- 方法名称
可用 通配符* 例:
匹配所有find开头的方法:find*(优先级高)
匹配所有方法:*
其他属性
指定方法名称:是业务核心方法
read-only:是否是只读事务。默认 false,不只读。
isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。
propagation:指定事务的传播行为。
timeout:指定超时时间。默认值为:-1。永不超时。
rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。
没有默认值,任何异常都回滚。
原文:https://www.cnblogs.com/platinumcat/p/12595561.html