spring的注解式事务使用:
①spring配置文件中引入<tx:>命名空间配置
<beans xmlns="http://www.springframework.org/schema/beans";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xmlns:tx="http://www.springframework.org/schema/tx";
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">;
②spring声明式事务配置
<!-- 事务管理器配置 -->
<bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="defaultTransactionManager" proxy-target-class="true" />
③在接口或类的声明处写@Transactional
如果写在接口中, 那么接口的实现类就会继承事务,但是只能当你设置了基于接口的代理时它才生效,所以使用事务时推荐写在具体的类中。
当标于类前时,标示类中所有的public方法都进行事务管理,不是public的方法标注了注解但是没有事务功能。
事物传播行为设置:
@Transactional(propagation=Propagation.REQUIRED) (默认设置)
如果有事务, 那么加入事务, 如果没有就新建一个。
@Transactional(propagation=Propagation.NOT_SUPPORTED)
此方法不开启事务管理
@Transactional(propagation=Propagation.REQUIRES_NEW)
无论是否存在事务,都创建一个新的事务,原来的挂起,等待新的事务执行完毕,然后在执行老的事务。
@Transactional(propagation=Propagation.MANDATORY)
必须在一个已有的事务中执行,否则抛出异常。
@Transactional(propagation=Propagation.NEVER)
必须在一个没有的事务中执行,否则抛出异常。
@Transactional(propagation=Propagation.SUPPORTS)
如果其他的BEAN调用这个方法,在其他的BEAN中声明事务,那就用事务。
如果其他的BEAN没有声明事务,那就不用事务。
事物超时时间设置:
@Transactional(timeout=30)
超时时间是30秒
事务隔离级别设置:
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
读取未提交数据(会出现脏读,、不可重复读)
@Transactional(isolation = Isolation.READ_COMMITTED)(SQLSERVER默认是此设置)
读取已提交数据(会出现不可重复读、幻读)
@Transactional(isolation = Isolation.REPEATABLE_READ)(MYSQL默认是此设置)
可重复读(会出现幻读)
@Transactional(isolation = Isolation.SERIALIZABLE)
串行化
名词解释:
脏读 : 一个事务读取到另一个事务中未提交的更新数据。
不可重复读 : 在一个事务中可以读取到另一个事务中已提交的更新数据。
可重复度:在一个事务中不能读取到另一个事务中已提交的更新数据。
幻读 : 在一个事务中可以读取到另一个事务中已提交的新增(insert)数据。