Spring 事务传播行为实验
一、Propagation :
key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED -- 而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
二,代码清单
Mysql 表,
CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`money` double DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
初始数据:
aaa 1000
bbb 1000
ccc 1000
public interface InnerService {
void InnerTransfer(String from, String to, double money);
}
@Service
public class InnerServiceImpl implements InnerService {
@Autowired
MyDao myDao;
@Transactional(propagation = Propagation.MANDATORY)
public void InnerTransfer(final String from, final String to, final double money) {
myDao.In(to, money);
// int a = 1 / 0;
myDao.Out(from, money);
}
}
public interface OuterService {
void OuterTransfer();
}
@Service
public class OuterServiceImpl implements OuterService {
@Autowired
InnerService innerService;
@Autowired
MyDao myDao;
public void OuterTransfer() {
myDao.In("ccc", 19);
innerService.InnerTransfer("aaa", "bbb", 100d);
int a = 1 / 0;
}
}
public interface MyDao {
void In(String user, double money);
void Out(String user, double money);
}
@Repository
public class MyDaoImpl extends JdbcDaoSupport implements MyDao {
@Autowired
private DataSource dataSource;
@PostConstruct
private void initialize() {
setDataSource(dataSource);
}
public void In(String user, double money) {
String sql = "update account set money = money + " + money + " where name='" + user + "'";
this.getJdbcTemplate().update(sql);
}
public void Out(String user, double money) {
String sql = "update account set money = money - ? where name=?";
this.getJdbcTemplate().update(sql, money, user);
}
}
配置文件略。
三、事务
OuterTransfer | InnerTransfer | 事务结果 | aaa | bbb | ccc |
MANDATORY | |||||
NOT_SUPPORTED | |||||
SUPPORTS | |||||
REQUIRES_NEW | |||||
REQUIRED | |||||
NEVER | |||||
NESTED | |||||
MANDATORY | |||||
MANDATORY | MANDATORY | ||||
MANDATORY | NOT_SUPPORTED | ||||
MANDATORY | SUPPORTS | ||||
MANDATORY | REQUIRES_NEW | ||||
MANDATORY | REQUIRED | ||||
MANDATORY | NEVER | ||||
MANDATORY | NESTED | ||||
NOT_SUPPORTED | |||||
NOT_SUPPORTED | MANDATORY | ||||
NOT_SUPPORTED | NOT_SUPPORTED | ||||
NOT_SUPPORTED | SUPPORTS | ||||
NOT_SUPPORTED | REQUIRES_NEW | ||||
NOT_SUPPORTED | REQUIRED | ||||
NOT_SUPPORTED | NEVER | ||||
NOT_SUPPORTED | NESTED | ||||
SUPPORTS | |||||
SUPPORTS | MANDATORY | ||||
SUPPORTS | NOT_SUPPORTED | ||||
SUPPORTS | SUPPORTS | ||||
SUPPORTS | REQUIRES_NEW | ||||
SUPPORTS | REQUIRED | ||||
SUPPORTS | NEVER | ||||
SUPPORTS | NESTED | ||||
REQUIRES_NEW | |||||
REQUIRES_NEW | MANDATORY | ||||
REQUIRES_NEW | NOT_SUPPORTED | ||||
REQUIRES_NEW | SUPPORTS | ||||
REQUIRES_NEW | REQUIRES_NEW | ||||
REQUIRES_NEW | REQUIRED | ||||
REQUIRES_NEW | NEVER | ||||
REQUIRES_NEW | NESTED | ||||
REQUIRED | |||||
REQUIRED | MANDATORY | ||||
REQUIRED | NOT_SUPPORTED | ||||
REQUIRED | SUPPORTS | ||||
REQUIRED | REQUIRES_NEW | ||||
REQUIRED | REQUIRED | ||||
REQUIRED | NEVER | ||||
REQUIRED | NESTED | ||||
NEVER | |||||
NEVER | MANDATORY | ||||
NEVER | NOT_SUPPORTED | ||||
NEVER | SUPPORTS | ||||
NEVER | REQUIRES_NEW | ||||
NEVER | REQUIRED | ||||
NEVER | NEVER | ||||
NEVER | NESTED | ||||
NESTED | |||||
NESTED | MANDATORY | ||||
NESTED | NOT_SUPPORTED | ||||
NESTED | SUPPORTS | ||||
NESTED | REQUIRES_NEW | ||||
NESTED | REQUIRED | ||||
NESTED | NEVER | ||||
NESTED | NESTED |