代码
controller
@RequestMapping(value = "/test.do")
public void test(Integer[] ids,HttpServletResponse response,Integer type,Boolean isTrx){
System.out.println("是否走事务方法:"+isTrx);
if(!isTrx){//没有事物
userInfoService.testNotTrx(type);
}else{//有事务
userInfoService.test(type);
}
}
service
public interface UserInfoService2 {
//当前方法有事务
public void test(Integer type);
//当前方法有事务
public void testNotTrx(Integer type);
//当前方法有事务
public void test1();
//当前方法有事务
public void test2();
//当前方法有事务
public void test3();
//当前方法有事务
public void test4();
//当前方法有事务
public void test5();
//当前方法有事务
public void test6();
//当前方法有事务
public void test71();
}
serviceImple
/**
* @ClassName UserInfoServiceImpl
* @Description TODO(用户的基础信息)
* @author Administrator
* @Date 2017年8月3日 下午1:43:49
* @version 1.0.0
*/
@Service
public class UserInfoServiceImpl2 implements UserInfoService2{
/**
* @Field @serialVersionUID : TODO(这里用一句话描述这个类的作用)
*/
@Autowired
private UserInfoDao userInfoDao;
@Transactional//有事务
@Override
public void test(Integer type) {
//数据库有条数据库:用户ID:204,用户名称testName1
UserInfo2 u1 = getUser1();
userInfoDao.update2(u1);
System.out.println("事务测试开始");
System.out.println(userInfoDao.findUser2(u1).toString());
// test当前事务ID
String trx_id=userInfoDao.selectTRX_ID();
System.out.println("test 事务ID:"+trx_id);
if(type==1){
test1();
}
if(type==2){
test2();
}
if(type==3){
test3();
}
if(type==4){
test4();
}
if(type==5){
test5();
}
if(type==6){
test6();
}
if(type==7){
test71();
}
System.out.println("事务测试结束");
}
@Override//没有事务
public void testNotTrx(Integer type) {
System.out.println("事务测试开始");
//数据库有条数据库:用户ID:204,用户名称testName1
// test当前事务ID
String trx_id=userInfoDao.selectTRX_ID();
UserInfo2 u1 = getUser1();
userInfoDao.update2(u1);
System.out.println("test事务ID:"+trx_id);
System.out.println(userInfoDao.findUser2(u1));
if(type==1){
test1();
}
if(type==2){
test2();
}
if(type==3){
test3();
}
if(type==4){
test4();
}
if(type==5){
test5();
}
if(type==6){
test6();
}
if(type==7){
test71();
}
System.out.println("事务测试结束");
}
// 事务传播行为
@Transactional(propagation=Propagation.MANDATORY)
////如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
// //适用于更新数据的操作
public void test1(){
UserInfo2 u2 = getUser2();
userInfoDao.update2(u2);
String trx_id=userInfoDao.selectTRX_ID();
System.out.println("test1事务ID:"+trx_id);
System.out.println(userInfoDao.findUser2(u2).toString());
}
@Transactional(propagation=Propagation.REQUIRED)
//如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
//适用于更新数据的操作
public void test2(){
UserInfo2 u2 = getUser2();
userInfoDao.update2(u2);
String trx_id=userInfoDao.selectTRX_ID();
System.out.println("test2事务ID:"+trx_id);
System.out.println(userInfoDao.findUser2(u2));
}
@Transactional(propagation=Propagation.SUPPORTS)
//如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
//适用于不需要事务的环境
public void test3(){
UserInfo2 u2 = getUser2();
userInfoDao.update2(u2);
String trx_id=userInfoDao.selectTRX_ID();
System.out.println("test3事务ID:"+trx_id);
System.out.println(userInfoDao.findUser2(u2));
}
@Transactional(propagation=Propagation.NOT_SUPPORTED)
//以非事务方式运行,如果当前存在事务,则把当前事务挂起。
//试用于:当前方法是独立的事务,注意:当前方法执行完,外部方法的事务是否还存在?
public void test4(){
UserInfo2 u2 = getUser2();
userInfoDao.update2(u2);
String trx_id=userInfoDao.selectTRX_ID();
System.out.println("test4事务ID:"+trx_id);
System.out.println(userInfoDao.findUser2(u2));
}
@Transactional(propagation=Propagation.NEVER)
//以非事务方式运行,如果当前存在事务,则抛出异常。
public void test5(){
UserInfo2 u2 = getUser2();
userInfoDao.update2(u2);
String trx_id=userInfoDao.selectTRX_ID();
System.out.println("test5事务ID:"+trx_id);
System.out.println(userInfoDao.findUser2(u2));
}
@Transactional(propagation=Propagation.NESTED)
//如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;
//如果当前没有事务,则该取值等价于Propagation.REQUIRED
public void test6(){
UserInfo2 u2 = getUser2();
userInfoDao.update2(u2);
String trx_id=userInfoDao.selectTRX_ID();
System.out.println("test6事务ID:"+trx_id);
System.out.println(userInfoDao.findUser2(u2));
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
// 方法运行在事务中,则挂起原事务,创建一个独立的新事物。否则也是创建一个独立的事务
public void test71(){
UserInfo2 u2 = getUser2();
userInfoDao.update2(u2);
String trx_id=userInfoDao.selectTRX_ID();
System.out.println("test71事务ID:"+trx_id);
System.out.println(userInfoDao.findUser2(u2));
}
private UserInfo2 getUser1(){
//数据库有条数据库:用户ID:204,用户名称testName1
UserInfo2 u1=new UserInfo2();
u1.setUserID(204);
u1.setUserName("getUser1");
return u1;
}
private UserInfo2 getUser2(){
//数据库有条数据库:用户ID:204,用户名称testName1
UserInfo2 u2=new UserInfo2();
u2.setUserID(204);
u2.setUserName("getUser2");
return u2;
}
}
dao
<select id="selectTRX_ID" resultType="String">
SELECT TRX_ID FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID();
</select>
<select id="findUser2" parameterType="UserInfo2" resultType="cn.xxx.UserInfo2">
select UserInfo.UserName
from UserInfo
where UserID=#{userID}
</select>
<update id="update2" parameterType="UserInfo2">
update UserInfo
<set>
<if test="userName != null and userName !=''">UserName=#{userName},</if>
</set>
where UserID=#{userID}
</update>
测试:
// 事务传播行为
@Transactional(propagation=Propagation.MANDATORY)
////如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
// //适用于更新数据的操作
public void test1(){
是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344011
test1事务ID:1344011
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test1事务ID:null
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
注意:没有异常
@Transactional(propagation=Propagation.REQUIRED)
//如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
//适用于更新数据的操作
public void test2(){
是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344017
test2事务ID:1344017
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test2事务ID:null
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
注意:没有创建事务
@Transactional(propagation=Propagation.SUPPORTS)
//如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
//适用于不需要事务的环境
public void test3(){
是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344027
test3事务ID:1344027
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test3事务ID:null
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
@Transactional(propagation=Propagation.NOT_SUPPORTED)
//以非事务方式运行,如果当前存在事务,则把当前事务挂起。
//试用于:当前方法是独立的事务,注意:当前方法执行完,外部方法的事务是否还存在?
public void test4(){
是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344029
test4事务ID:1344029
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test4事务ID:null
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
@Transactional(propagation=Propagation.NEVER)
//以非事务方式运行,如果当前存在事务,则抛出异常。
public void test5(){
是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344039
test5事务ID:1344039
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test5事务ID:null
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
@Transactional(propagation=Propagation.NESTED)
//如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;
//如果当前没有事务,则该取值等价于Propagation.REQUIRED
public void test6(){
是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344041
test6事务ID:1344041
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test6事务ID:null
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
@Transactional(propagation=Propagation.REQUIRES_NEW)
// 方法运行在事务中,则挂起原事务,创建一个独立的新事物。否则也是创建一个独立的事务
public void test71(){
是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344051
test71事务ID:1344051
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test71事务ID:null
UserInfo2 [userID=null, userName=getUser2]
事务测试结束
为什么会不走事务方法都会出这样问题呢,看下一编