乐趣区

关于javascript:知识分享如何通过-Spring-框架进行-JDBC-事务控制

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): 事务提交结束后,数据库中的数据的扭转是永恒的.

退出移动版