《二》基于xml配置spring的事务管理
<bean id="txManager " class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<aop:config>
<aop:pointcut id="transactionPointcut " expression="execution(* cn.jianchen.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice " pointcut-ref="transactionPointcut "/>
</aop:config>
<tx:advice id="txAdvice " transaction-manager="txManager ">
<tx:attributes>
<tx:method name="get*" read-only="true" propagation ="NOT_SUPPORTED"/> //对获取方法不采用事务(以get开头的方法)
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--打开采用@transactional注解方式使用事务 -->
<tx:annotation-driven transaction-manager="txManager "/>
问:JdbcTemplate.update方法单独执行内部使用了事务没有?
答:应该是启动了事务的。
public void delete(Integer personid1 ,Integer personid2 )throws Exception{
jdbcTemplate.update("delete from person where id=?",new Object[]{personid1 },new int[]{java.sql.Types.INTEGER});
jdbcTemplate.update("delete from person where id=?",new Object[]{personid2 },new int[]{java.sql.Types.INTEGER});
}
如果未对delete方法配置事务管理,则delete方法内部的两条update语句,每条语句都会在自己的事务中执行,两者互不相干。就是说第二条更新语句出现问题出现了回滚不会影响到前一条语句的执行结果。
如果对delete方法配置了事务管理,就像前面使用注解或xml都行,只要配置了事务管理,那么两个方法就在同一个事务中执行,后一条语句出现问题会导致整个事务的回滚,第一条更新语句也要进行回滚操作。
数据库系统提供了四种事务隔离级
数据库系统提供了四种事务隔离级别提供用户选择。不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最 高,Read Uncommited的隔离级别最低。大多数数据库默认的隔离级别为Read Commited,如SqlServer,当然也有少数部分数据库默认的隔离级别为Repeatable Read,如Mysql
Read Uncoommited:读未提交数据(会出现脏读,不可重复读和幻读)
Read Commited:读已提交数据(会出现不可重复读和幻读)
Repeatable Read:可重复读(会出现幻读)
Serializable:串行化
脏读:一个事务读取到另一个事务未提交的更新数据。
不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。
相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。
幻读:一个事务读取到另一事务已提交的insert数据。
mysql数据库使用快照技术实现可重复读。在同一事务中,将相关的数据库内容进行快照,以后在该同一事务中需要再次读取时,从快照中读取保证了读取的内容的一致性。