转自:http://www.blogjava.net/zhaoguo543166/articles/373912.html还有:http://blog.sina.com.cn/s/blog_6ac4c6cb01018pbl.html
1.@Transactional
一般写一个对数据操作的方法我们总会在方法的上面加上@transactional标识符,有些时候出现不会回滚,而且内嵌一个事物后还会抛出异常。
一下
// 指定回滚
@Transactional(rollbackFor=Exception.class)
public void methodName() {
// 不会回滚
throw new Exception("...");
}
//指定不回滚
@Transactional(noRollbackFor=Exception.class)
public ItimDaoImpl getItemDaoImpl() {
// 会回滚
throw new RuntimeException("注释");
}
// 指定回滚
@Transactional(rollbackFor=Exception.class)
public void methodName() {
// 不会回滚
throw new Exception("...");
}
//指定不回滚
@Transactional(noRollbackFor=Exception.class)
public ItimDaoImpl getItemDaoImpl() {
// 会回滚
throw new RuntimeException("注释");
}
// 如果有事务,那么加入事务,没有的话新建一个(不写的情况下)
@Transactional(propagation=Propagation.REQUIRED)
// 容器不为这个方法开启事务
@Transactional(propagation=Propagation.NOT_SUPPORTED)
// 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
// 必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.MANDATORY)
// 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.NEVER)
// 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
@Transactional(propagation=Propagation.SUPPORTS)
另一篇:
我记得当时我遇到这个问题的时候,是因为数据库的表,不支持事务!如果mysql不支持存储引擎,它将以MyISAM表创建表,这是非事务性表。一般修改成InnoDB.
使用下述语句,可检查mysqld服务器支持的存储引擎:
例如,要想确定InnoDB存储引擎是否可用,可检查have_innodb变量的值。
--------------------------------------------------------------------------------------------------
近日测试用例,发现这样一个现象:
在业务代码中,有如下两种情况,比如:
throw
throw
自以为很了解事务,或许时间久远的缘故,没分析出来何故,遂查阅了下资料,写下了如下的内容,供参考:
1).Spring的AOP即声明式事务管理默认是针对unchecked
解决办法:
1.在针对事务的类中抛出RuntimeException异常,而不是抛出Exception。
2.在txAdive中增加rollback-for,里面写自己的exception,例如自己写的exception:
<tx:advice
或者
定义不会滚的异常
<tx:advice
2).spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit
如:
try
}
}