Spring入门(07-01)-Spring的事务-注解方式

本文深入探讨Spring框架中的事务管理机制,包括默认回滚策略、如何通过注解定制回滚规则,以及不同传播行为的含义与应用场景。此外,还提供了一个具体的实现示例。

 用 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"/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值