用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.
默认遇到运行期例外
(throw new RuntimeException();)会回滚:
unchecked,需要捕获的例外(throw new Exception();)不会回滚:
checked.需要修改规则加入注释:
@Transactional(rollbackFor=Exception.class) //指定回滚,需要捕获的例外(throw new Exception("");)不会回滚
public void methodName() {
throw new Exception("");
}
@Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外
(throw new RuntimeException("");)会回滚
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)
/*public void methodName(){
update();//本类的修改方法 1
otherBean.update();//调用其他类的修改方法
update();//本类的修改方法 2
}
other失败了不会影响 本类的修改提交成功,本类update的失败,other也失败
*/
@Transactional(propagation=Propagation.NESTED)
@Transactional (propagation = Propagation.REQUIRED,readOnly=true)
//readOnly=true只读,不能更新,删除
@Transactional (propagation = Propagation.REQUIRED,timeout=30)
//设置超时时间
@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)
//设置数据库隔离级别
code:
import java.util.List;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.hx.springjdbc.bean.Login;
import com.hx.springjdbc.service.LoginService;
@Transactional
public class LoginServiceImpl implements LoginService {
private JdbcTemplate jdbcTemplate;
public void setDataSource(BasicDataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
//@Transactional(rollbackFor = Exception.class)
@Transactional(noRollbackFor=RuntimeException.class)
public void delete(int id) throws Exception {
// TODO Auto-generated method stub
jdbcTemplate.update("delete from Login where id=?",
new Object[] { id }, new int[] { java.sql.Types.INTEGER });
//throw new Exception();
throw new RuntimeException();
}
//不支持事务
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public Login getLogin(int id) {
// TODO Auto-generated method stub
return (Login) jdbcTemplate.queryForObject(
"select * from Login where id=?", new Object[] { id },
new LoginRowMapper());
}
@SuppressWarnings("unchecked")
public List<Login> getLogins() {
// TODO Auto-generated method stub
return (List<Login>) jdbcTemplate.query("select * from Login",
new LoginRowMapper());
}
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public void save(Login login) {
// TODO Auto-generated method stub
jdbcTemplate.update("insert into login(name) values(?)",
new Object[] { login.getName() },
new int[] { java.sql.Types.VARCHAR });
}
public void update(Login login) {
// TODO Auto-generated method stub
jdbcTemplate.update("update Login set name=? where id=?", new Object[] {
login.getName(), login.getId() }, new int[] {
java.sql.Types.VARCHAR, java.sql.Types.INTEGER });
}
配置文件:
<!-- 采用注解方式使用事务 -->
<tx:annotation-driven transaction-manager="txManager"/>
本文深入探讨Spring框架中的事务管理机制,包括默认回滚策略、如何通过注解定制回滚规则,以及不同传播行为的含义与应用场景。此外,还提供了一个具体的实现示例。
2816

被折叠的 条评论
为什么被折叠?



