关于事务

SpringWeb MVC:是一个Model-View-Controller Web框架。

  • 模型(Model)代表数据控制器。数据的读取,插入,更新都是由模型来负责。
  • 视图(View)是展示给用户的最终页面。视图负责将数据以用户友好的形式展现出来。
  • 控制器(Controller)是模型,视图以及其他任何处理 HTTP 请求所必须的资源之前的中介
  • 服务(Service): service属于业务的具体实现。所以事务本身属于service层。 在服务层通常要使用@Transactional 进行事务管理

声明式事务与编程式事务
声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。(@Transactional)
编程式事务可以达到代码块级别的事务控制,但是声明式事务最多只能实现方法级别的事务管理。
补充:

  • @Transactional 注解应用到只会对 public 方法,进行事务管理。(如果调用其他对象 也必须的public级别的)
  • 这里由于事务基于AOP实现的,是借助JVM动态代理机制(反射机制来进行管理的)

为什么要实现事务管理?

事务:可以是一条sql、或者一组sql或者整个程序。
最常用的原因:保证当一个方法中有一个sql执行失败,在它之前的sql操作都会被回滚,不会执行成功。

事务的特点
原子性:多条指令作为一个集体,要么都执行,要么都不执行
一致性:比如 a=100 b=100 a、b之间交易 总和一定是200
隔离性:一个事务不受其他事务的影响
持久性:事务一旦提交,它对数据库的改变时永久性的

怎样实现事务管理呢?

Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。
常见的有:
1.jdbc事务(mybayis通常使用这个方式进行事务管理)

<!--注入 事务管理器  这个注解驱动 告诉 spring 注解驱动 具体上网搜索  -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

2.Hibernate事务

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

3.Java持久化API事务(JPA)

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

4.Java原生API事务 (使用以上多种事务)

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="java:/TransactionManager" />
</bean>

事务使用

@Test
public void test(){
// 默认的事务定义
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
//开启事务。
TransactionStatus transaction = transactionManager.getTransaction(defaultTransactionDefinition);
try {
Account account = new Account();
account.setUserName("wokalakala");
List<Account> accountList = accountMapper.queryAccountList(account);
}catch (Exception e){
//事务回滚
transactionManager.rollback(transaction);
}
//事务提交
transactionManager.commit(transaction);
}

  • commit(TransactionStatus status) ; //事务提交
  • getTransaction(TransactionDefinition definition) ; //开始事务
  • rollback(TransactionStatus status) ; //事务回滚