Spring 进行 JDBC 事务管制的形式
- 通过 xml 配置实现
- 通过注解实现
案例实操
Xml 事物配置申明
1). 批改 xml 命名空间
xmlns:tx=”http://www.springframework.org/schema/tx”
http://www.springframework.or…
http://www.springframework.or…
2).aop 代理
<aop:aspectj-autoproxy /><!– aop –>
3). 配置事物管理器
<!– 事务管理器定义 –>
<bean id=”txManager”
class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>
<property name=”dataSource” ref=”dataSource”></property>
</bean>
4). 配置事务相干告诉
一般来说增删改办法 propagation=Required,对于查询方法应用 read-only=“true”
示例如下:
<!– 配置告诉 –>
<!–
tx:method 的属性:
- name 是必须的, 示意与事务属性关联的办法名(业务办法名), 对切入点进行细化。通配
符(*)能够用来指定一批关联到雷同的事务属性的办法。
如:’get‘、’handle‘、’on*Event’ 等等.
propagation 不是必须的,默认值是 REQUIRED
示意事务流传行为, 包含
REQUIRED,SUPPORTS,MANDATORY,REQUIRES_NEW,NOT_SUPPORTED,NEVER,NESTED
isolation 不是必须的 默认值 DEFAULT
示意事务隔离级别 (数据库的隔离级别)
timeout 不是必须的 默认值 -1(永不超时)
示意事务超时的工夫(以秒为单位)
read-only 不是必须的 默认值 false 不是只读的
示意事务是否只读
rollback-for 不是必须的
示意将被触发进行回滚的 Exception(s);以逗号离开。
如:’com.foo.MyBusinessException,ServletException’
no-rollback-for 不是必须的
示意不被触发进行回滚的 Exception(s);以逗号离开。
如:’com.foo.MyBusinessException,ServletException’
任何 RuntimeException 将触发事务回滚
–>
<tx:advice id=”txAdvice” transaction-manager=”txManager”>
<tx:attributes>
<!– 匹配以 save 结尾的 service 办法均退出事务 –>
<tx:method name=”save*” propagation=”REQUIRED” />
<!—匹配以 del 结尾的 service 办法均退出事务 –>
<tx:method name=”del*” propagation=”REQUIRED” />
<!—匹配以 update 结尾的 service 办法均退出事务 –>
<tx:method name=”update*” propagation=”REQUIRED” />
<!—匹配以 query 结尾的 service 办法事物为只读模式 –>
<tx:method name=”query*” read-only=”true” />
</tx:attributes>
</tx:advice>
事务流传行为介绍
@Transactional(propagation=Propagation.REQUIRED)
如果有事务, 那么退出事务, 没有的话新建一个 (默认状况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED)
容器不为这个办法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
不论是否存在事务, 都创立一个新的事务, 原来的挂起, 新的执行结束, 继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY)
必须在一个已有的事务中执行, 否则抛出异样
@Transactional(propagation=Propagation.NEVER)
必须在一个没有的事务中执行, 否则抛出异样 (与 Propagation.MANDATORY 相同)
@Transactional(propagation=Propagation.SUPPORTS)
如果其余 bean 调用这个办法, 在其余 bean 中申明事务, 那就用事务. 如果其余 bean 没有申明事务, 那就不必事务.
5). 配置 aop(切入点、告诉)
<!– aop 切面定义 –>
<aop:config>
<aop:pointcut expression=”execution( com.xxx.service...*(..) )”id=”cut” />
<aop:advisor advice-ref=”txAdvice” pointcut-ref=”cut” />
</aop:config>
Spring 事务管理注解形式
1). 配置事物管理器
<!– spring 注解式事务申明 –>
<!– 事务管理器定义 –>
<bean id=”txManager”
class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>
<property name=”dataSource” ref=”dataSource”></property>
</bean>
2). 配置注解反对
<tx:annotation-driven transaction-manager=”txManager”/>
3).Service 办法上在须要增加事务的办法上退出事物注解
@Override
@Transactional(propagation=Propagation.REQUIRED)
public void saveUser(String userName,String userPwd){
User user1=new User();
user1.setUserName(userName);
user1.setUserPwd(userPwd);
userDao.saveUser(user1);
userDao.delUserById(2);
}
备注:默认 spring 事务只在产生未被捕捉的 runtimeexcetpion 时才回滚。spring aop 异样捕捉原理:被拦挡的办法需显式抛出异样,并不能经任何解决,这样 aop 代理能力捕捉到办法的异样,能力进行回滚,默认状况下 aop 只捕捉 runtimeexception 的异样,但能够通过配置来捕捉特定的异样并回滚 换句话说在 service 的办法中不应用 try catch 或者在 catch 中最初加上 throw new RunTimeexcetpion(),这样程序异样时能力被 aop 捕捉进而回滚.
扩大
事务四大个性(即:ACID)
原子性(Atomicity):业务管制的最小单位,并发管制的最小单位,【不能够宰割】
一致性(Consistency):事务在执行前后,数据库中数据要放弃一致性状态。(如转账的过程 账户操作后数据必须保持一致)—- > 保证数据的完整性(正确性)
隔离性(Isolation):事务与事务之间的执行该当是互相隔离互不影响的。(多个角色对对立记录进行操作必须保障没有任何烦扰),当然没有影响是不可能的,为了让影响级别降到最低,通过隔离级别加以限度:
- READ_UNCOMMITTED
- READ_COMMITTED
- REPEATABLE_READ
- SERIALIZABLE
持久性(Durability): 事务提交结束后,数据库中的数据的扭转是永恒的.