您的位置:首页 > 其它

声明式事务

2016-03-28 20:44 274 查看
一个简单的小例子关于声明式事务
/**
*CreatedbyAdministratoron2015/11/27.
*声明式事务管理类
*/

publicclassAddDAO{
JdbcTemplatejdbcTemplate;

publicvoidsetJdbcTemplate(JdbcTemplatejdbcTemplate){
this.jdbcTemplate=jdbcTemplate;
}

publicJdbcTemplategetJdbcTemplate(){
returnjdbcTemplate;
}

publicAddDAO(){}
/**使用这个注解可以声明这个方法是一个事务
*关于事务的传播性
propagation=Propagation.REQUIRED属性为默认值,当在一个事务中调用一个事务的时候,
它将采用原来的事务即同一个事务,第一个sql完成,异常,事务回滚。
propagation=Propagation.REQUIRES_NEW的时候,当在一个事务中调用另一个事务,它
将采取创建一个新的事务,这样,当第一个sql这行完成,就完成了一个事务,然后异常来了,
接着抛出异常,第一个sql完成不再回滚。
**/

/**readOnly=false这个是只读属性*/

/**timeout=5设置指定强制回滚之前事务可以占用的时间**/

@Transactional(propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_COMMITTED,
readOnly=false,timeout=5)
publicvoidaddBook(){
Stringsql1="insertintoBookimformationvalues(100120,'zzyyxl','yxlzzy',30,900)";
jdbcTemplate.execute(sql1);
System.out.println("firstissuccess");
/**可在这里加上人造异常测试事务**/
Stringsql2="insertintoBookimformationvalues(100121,'zzyyxl','yxlzzy',30,900)";
jdbcTemplate.execute(sql2);
System.out.println("secondissuccess");
}
}
/**
使用声明式事务分为三步,第一,定义事务管理器,
第二,<tx:annotation-driventransaction-manager="dataSourceTransactionManager"/>,
定义这个可以使用注解的方式实现声明式事务。
第三在相对应得类的方法前注解@Transactional//使用这个注解可以声明这个方法是一个事务
**/

publicclassMain{
//这个事务是成功的
publicstaticvoidmain(String[]args){
ApplicationContextctx=newClassPathXmlApplicationContext("spring-config.xml");
AddDAOaddDAO=(AddDAO)ctx.getBean("addDAO");
addDAO.addBook();
}
}

spring配置内容如下:(前提:配过dataSource和jdbcTemplate)

<!--定义事务管理器-->
<beanid="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<propertyname="dataSource">
<refbean="dataSource2"></ref>
</property>
</bean>

<!--定义这个可以使用注解的方式实现声明式事务-->
<tx:annotation-driventransaction-manager="dataSourceTransactionManager"/>

<!--配置一个普通的TransactionProxyFactoryBean包下的bean,实现声明式事务-->
<beanid="addDAO"class="Spring_AOP.TransactionProxyFactoryBean.AddDAO">
<propertyname="jdbcTemplate">
<refbean="jdbcTemplate"></ref>
</property>
</bean>


/**
*这个类用来测试事务的传播
*即propagation=Propagation.REQUIRES_NEW的时候,当在一个事务中调用另一个事务,它
将采取创建一个新的事务,这样,当第一个sql这行完成,就完成了一个事务,然后异常来了,
接着抛出异常,第一个sql完成不再回滚。
***/
publicclassTestswcb{
publicTestswcb(){}

privateAddDAOaddDAO;
publicvoidsetAddDAO(AddDAOaddDAO){
this.addDAO=addDAO;
}

@Transactional(propagation=Propagation.REQUIRED)
publicvoidcs(){
addDAO.addBook();
//这里可以人造异常,测试事务的传播
addDAO.addBook();
}
publicstaticvoidmain(String[]args){
ApplicationContextctx=newClassPathXmlApplicationContext("spring-config.xml");
Testswcbtestswcb=(Testswcb)ctx.getBean("testswcb");
testswcb.cs();
}
}

spring里面的配置如下:
<beanid="testswcb"class="Spring_AOP.TransactionProxyFactoryBean.Testswcb">
<propertyname="addDAO"ref="addDAO"></property>
</bean>



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: