事务的定义和特性:
事务是应用程序中的一系列严密的操作,当中只要某个操作出错,那么在每个操作中所作的所有更改都会被撤消,只有全部步骤完成才算成功。
ACID事务四大特性: 原子性、一致性、隔离性、持久性
原子性:事务的操作要么全部成功,要么全部回滚。
一致性:事务必须使数据从一个数据一致性转换到另外一个一致性状态,也就是事务执行之前和事务执行之都保持一致性状态。 比如转账。
隔离性:多个用户访问数据库,需要为每个用户创建事务,执行某个事务的时候不会被别的事务干扰,多个事务之间相互隔离。
持久性:是指事务一旦提交,数据在数据库的改变是永久性的,即便数据库发生故障也不会丢失事务提交的操作。
一:事务分为:编程试事务和声明式事务
声明式事务可以在配置文件配置事务规则声明或者使用注解Transational进行事务声明;
好处:是不用在代码掺杂事务管理的代码,避免了编程式事务;
缺点:是声明式事务只能作用到方法级别,而编程式事务可以作用到代码块级别;
解决:将需要用到事务的代码块独立为单个的方法;
二:事务的七大传播行为:
REQUERIED
REQUERIES_NEW
SUPPORTS
NOT_SUPPORTED
NEVER
MANDATORY
NESTED 如果存在当前事务,就在嵌套事务执行,否则和REQUERIED类似的操作。
@Transactional(propagtion=Propagation.REQUERIED)
三:事务的四大隔离性:
READ_COMMITED :读取已提交事务的数据(可能会不可重复读取,和幻读)
READ_UNCOMMITED:读取未提交的数据(级别最低,会出现脏读,不可重复度)
REPEATABLE_READ :可重复读取(可能会出现脏读)
SERIALIZABLE :是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。
@Transactional(isolation=Isolation.READ_COMMITED)
四:java实现事务管理常用两种方式
1.通过配置事务规则声明 2.通过注解@Transactional
1)导入tx命名空间
2)配置事务管理器
<bean id="managerId" class=".." >
<property name ="sessionFactory" ref="sessonFactory"/>
</bean>
------------------------
注解方式的话
<tx:annotation-driven tansaction-manager="managerId" proxy-target-class="ture"/>
3)配置事务传播 advice
<tx:adivce id="adivceId" transaction-manager="managerId">
<tx:atributes>
<tx:method name="add*" popagation="REQUERIRE"/>
。。。
</tx:atributes>
</tx:adivce>
4)配置事务切点 aop poitcut
<aop:config>
<aop:poitcut execution(* com.zyshen..*.*(..)) id="cutId"/>
<aop:advisor advice-ref="adviceId" poitcut-ref="cutId"/>
</aop:config>