1,spring 使用注解的形式进行事物管理.主要代码如下,整个项目的代码点击这里下载.
service代码如下:
package com.junlenet.spring.transactional.service;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.junlenet.spring.transactional.Util;
import com.junlenet.spring.transactional.mappers.RoleMapper;
import com.junlenet.spring.transactional.model.Role;
/**
* spring service
* @author huweijun
* @date 2016年8月10日 下午8:19:49
*/
@Service
public class SpringTransactionalService {
@Autowired
private RoleMapper roleMapper;
@Autowired
private AnotherSpringTransactionalService anotherTxService;
/**
* 无事务注解 (提交至数据库)
* @author huweijun
* @date 2016年8月10日 下午8:37:57
*/
public void noTransAnnotation() {
Role role = new Role();
role.setName("not trans annotation");
role.setCreateTime(new Date());
roleMapper.insert(role);
throw new RuntimeException("not trans annotation exception");
}
/**
* 正常提交(事物提交)
* @author huweijun
* @date 2016年8月10日 下午8:39:46
*/
@Transactional
public void normalCommit() {
Role role = new Role();
role.setCreateTime(new Date());
role.setName("normal commit");
roleMapper.insert(role);
}
/**
* 抛出异常(事物提交)
* @throws Exception
* @author huweijun
* @date 2016年8月10日 下午8:40:15
*/
@Transactional
public void commitOnCheckedException() throws Exception {
Role role = new Role();
role.setName("commit on checked exception");
role.setCreateTime(new Date());
roleMapper.insert(role);
throw new Exception("rollback checked exception");
}
/**
* 为某异常回滚(事物回滚)
* @throws Exception
* @author huweijun
* @date 2016年8月10日 下午8:41:13
*/
@Transactional(rollbackFor = Exception.class )
public void rollbackOnCheckedException() throws Exception {
Role role = new Role();
role.setName("roll back on checked exception");
role.setCreateTime(new Date());
roleMapper.insert(role);
throw new Exception("rollback checked exception");
}
/**
* 事务方法中抛异常(事物未提交)
* @author huweijun
* @date 2016年8月10日 下午8:42:14
*/
@Transactional
public void throwExceptionInMethod() {
Role role = new Role();
role.setName("throwExceptionInTransMethod");
role.setCreateTime(new Date());
roleMapper.insert(role);
throw new RuntimeException("throw exception in transaction method");
}
/**
* 同一事务中获取未提交数据(事物未提交)
* @author huweijun
* @date 2016年8月10日 下午8:49:39
*/
@Transactional
public void getNotCommitDataInTheSameTransaction(){
Role role = new Role();
role.setName("not commit role");
role.setCreateTime(new Date());
roleMapper.insert(role);
List<Role> roles = roleMapper.selectRoleByName("not commit role");
System.out.println(roles.get(0).getName());//有数据的
throw new RuntimeException("not commit data");
}
/**
* 事务方法中调用同一个类中的另一个事务方法(事物未提交)
* @author huweijun
* @date 2016年8月10日 下午8:50:06
*/
@Transactional
public void invokeRequireNewTransMethodInSameClass() {
requireNewTransactionMethod();//事物未提交
throw new RuntimeException("throw trans method in same class exception.");
}
/**
* 务方法中调用另一个类中的另一个事务方法
* @author huweijun
* @date 2016年8月10日 下午8:56:26
*/
@Transactional
public void invokeRequireNewTransMethodInAnotherService(){
Role role = new Role();
role.setName("require_new_transaction_in_another_service");
role.setCreateTime(new Date());
roleMapper.insert(role);// 事物未提交
anotherTxService.requireNewTrans(); //事物提交
throw new RuntimeException("throw invoke require new trans method in another service");
}
/**
* 开启新的事物
* @author huweijun
* @date 2016年8月10日 下午8:57:54
*/
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void requireNewTransactionMethod() {
Util.printStackInfo();
Role role = new Role();
role.setCreateTime(new Date());
role.setName("require_new_transaction");
roleMapper.insert(role);
}
}
another service
package com.junlenet.spring.transactional.service;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.junlenet.spring.transactional.Util;
import com.junlenet.spring.transactional.mappers.RoleMapper;
import com.junlenet.spring.transactional.model.Role;
/**
* 另一个spring service
* @author huweijun
* @date 2016年8月10日 下午8:20:23
*/
@Service
public class AnotherSpringTransactionalService {
@Autowired
private RoleMapper roleMapper;
/**
* 另开启一个新的事物
* @author huweijun
* @date 2016年8月10日 下午8:57:41
*/
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void requireNewTrans(){
Util.printStackInfo();
Role role = new Role();
role.setCreateTime(new Date());
role.setName("anotherTxService require new trans");
roleMapper.insert(role);
}
}