理解事务
ACID
原子性:事务是由一个或者多个活动所组成的一个工作单元。原子性确保事务中的所有操作
全部发生或者全部不发生,如果一个活动失败了,那么整个事务也就失败并且回滚
一致性:一旦事务完成,系统必须确保它的所有建模的业务必须处于一致的状态
隔离性:每个用户的操作不会与其他用户纠缠到一起,(隔离性涉及锁定到数据库表
或者行)
持久性:一旦事务完成,事务的结果应该被持久化。这样就能从任何奔溃系统中恢复过啦
理解spring对事务管理的支持
如果应用程序的事务跨了多个资源,那么spring会用第三方的JTA实现来分布式(XA)事务
选择事务管理器
spring并不直接管理事务,而是提供了多种事务管理器,他们将事务的管理职责给JTA
或其他持久化机制的平台相关的事务实现。
jdbc事务
<bean id="transactionManager" class="... .DataSourceTransactionManager">
<property name="database" ref="database"/> //管理谁
Hibernate事务
<bean id="hibernatetransactionManager" class="... .HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory">
JPA事务(java持久化api)
<bean id="transactionManager" class="... .JpaTransactionManager">
<property name="entityManagerFactory" ref=""> //jpa 实体工厂
声明式事务
spring 使用tx命名空间和@transactional注解
定义事务属性
在spring 中,声明式事务通过事务属性来定义的,事务属性包含5个方面
传播行为
1 PROPAGATION(传播)_MANDATORY(必须遵守的) :该方法必须在事务中运行,如果当前
不存在事务,就会抛出异常
2PROPAGATION_NESTED:如果当前已存在事务,那么该方法在嵌套事务中运行,嵌套的事务
可以独立于当前事务进行单独的提交或者回滚,如果当前事务不存在,那么行为与PROPAGATION
_REQUIRED一样
3PROPAGATION_NEVER:表示当前方法不应该在事务中运行,如果在事务中运行则会抛出异常
4PROPAGTION_NOT_SUPPORTED:表示该方法不应该运行在事务中,当方法运行期间,那么它
将会挂起,如果用jta事务管理器的话,则需要询问事务管理器
5PROPAGATION_REQIRED:如果当前方法必须运行在事务中,如果事务存在,方法将会在该事务
中运行,如果没有,那么就会启动新建事务
6PROPAGETION_REQUIRES_NEW:表示当前方法必须运行在它自己的事务中,一个新的事务
将会被启动,如果当前存在事务,在该方法执行期间,当前事务会被挂起,如果使用jta事务
管理器,那么则需要访问jta事务管理器
7PROPAGATION_SUPPORTS:当前方法不需要事务上下文,如果存在当前事务的话,那么该方法会在
这个事务中运行
隔离级别
多个事务并行导致的问题
脏读
不可重复读
幻读
读已提交
读未提交
可重复读
串行读
在xml中定义事务
<tx:advice id="">
<tx:attributes>
<tx:method>
<tx:advice> 来声明事务,还需要一个事务管理器,
<tx:advice transaction-manager ="transactionManager">
<tx:advice>只定义了aop通知,用于把事务边界通知给方法,但是这是事务通知,不是完整的
事务切面,需要定义哪些bean需要被通知,那么我们必须定义一个通知器
<aop:config>
<aop:advisor>
<pointcut="表达式"> 切点 就是什么时候执行事务
advice-ref="txadvice"
定义注解驱动的事务
<tx:annotation-driven>