3.9事务
3.9.1默认的事务
EMAP默认的事务处理方式如下:
在第一次更新操作执行时开启事务,此事务一直到当前控制器执行结束。然后,根据是否有异常抛出,来确定是提交或回滚。
对于查询操作,如果在未开启事务时,则会在无事务的情况下进行查询。如果已开启了事务,则会在这个事务中进行查询。
3.9.2声明式事务
声明式的事务采用与spring相同的标注“@Transactional”,如:
@Transactional
public void doXXX()
其工作方式也与spring的相同。
3.9.3两种事务的混合
已定义了声明式事务的方法如下:
@Transactional
doMyUpdate() {
…
}
情况1:
doSomeUpdate();
doMyUpdate();
由于先执行了更新操作,事务已开启,“doMyUpdate”方法调用时将加入这个事务,此方法结束时事务不会结束,需等到控制器执行结束。
情况2:
doMyUpdate();
doSomeUpdate();
“doMyUpdate”方法会在单独的事务中,方法结束事务也结束,后面的更新操作将重新开启另一个事务。
情况3:
doSomeUpdate();
try {
doMyUpdate();
}
catch…
由于先执行了更新操作,事务已开启,“doMyUpdate”方法调用时将加入这个事务,如果有异常被捕获但未继续抛出,则最后控制器执行结束将提交事务而不是回滚。
这与情况1类似,只是多了个异常的捕获且未继续抛出。如果“doMyUpdate”前没有执行更新操作,那么此方法会在单独的事务中,方法外的异常捕获不会影响事务的提交或回滚。