Spring事务管理

Spring事务管理


#事务的作用和意义

 作用:可以保障一组操作的完整性
 使用时机:两个或两个以上操作,至少有一个操作涉及DML语句

#回顾下JDBC事务管理

 JDBC默认自动提交.

  con.executeUpdate();//自动commit

		public void f1(){
		 try{
			con.setAutoCommit(false);//关闭自动提交
			con.executeUpdate(更新1SQL)
			int rows = con.executeUpdate(更新2SQL)
			if(rows==0){
				 throw 异常;
			}
			con.commit();//提交事务
		 }catch(){
			 con.rollback()//回滚事务
		 }
		}
Mybatis:默认非自动提交


#Spring事务管理


Spring整合JDBC或Mybatis后,事务是自动提交。

Spring事务管理,可以在不修改原有组件代码情况下,通过追加配置追加事务控制逻辑。

	public void someServiceMethod(){
		try{
		//Dao操作1
		//Dao操作2
		//提交事务
	 }catch(){
		//回滚事务
	 }
	}

	public class SomeService{
		 public void f1(){
				//更新1
				//更新2
		 }
	}

	public class SomeService$Proxy{
		 public void f1(){
			 try{
					调用SomeService.f1();
					//提交事务 txManager.提交事务
			 }catch(){
				 //回滚事务 txManager.回滚事务
			 }
		 }
	}

##XML配置事务(了解)
  特点:只需要对XML修改;配置复杂

##注解配置事务(掌握)

  特点:需要对XML修改,并且在代码中追加注解标记(@Transactional)

  配置使用简单,灵活.

 使用步骤

    --定义一个bean组件,

        DataSourceTransactionManager

    --启用事务注解配置@Transactional

     <tx:annotation-driven transaction-manager="事务管理bean的ID"/>

    --在业务组件上或方法上追加@Transactional


**Spring声明式事务(以配置方法事务管理)

Spring编程式事务(基于java编码事务管理)


#Spring事务特性

 --读写特性

  默认可读可写。建议查询方法用只读。

  @Transactional(readOnly=true)


 --回滚特性

  默认遇到运行时异常回滚;检查类异常不回滚

 @Transactional(rollbackFor={IOException.class})

 public void f1(){

   //执行SQL操作

   //执行文件操作,抛出了IOException

 }

 作用:遇到IOException也要撤销前面SQL操作


--传播特性

 默认为REQUIRED。

 只有两个事务管理方法发生关联时涉及。

 @Transactional(propagation=Propagation.REQUIRED)


 @Transactional
 public void f1(){
     //执行SQL1处理
     f2();
 };

 @Transactional(propagation=REQUIRED)
 public void f2(){
   //执行SQL2处理
   //执行SQL3处理
 };

--隔离特性

 当发生事务并发时会涉及隔离控制。

 事务隔离级别如下:

 ----READ_UNCOMMITED 读未提交

 ----READ_COMMITED 读已提交

 ----REPEATABLE_READ 可重复读

 ----SERIALIZABLE 序列化操作

 ----DEFAULT 默认级别,根据数据库设定

     Oracle为READ_COMMITED

 级别越高并发处理能力越差,安全性越好

 级别越低并发处理能力越强,安全性越差

@Transactional(isolation=Isolation.REPEATABLE_READ)

public void f1(){

   //查询id=1记录
   //处理记录信息
   //查询id=1记录
   //处理记录信息
}

public void f1(){
   //执行逻辑1
  synchornized(){
   //执行逻辑2--》对同一个数据操作
  }
   //执行逻辑3
}

@Transactional(isolation=Isolation.DEFAULT)

public void f1(){

  //逻辑处理1
  select * from emp where eno=101
  for update;//将eno=101锁住
  //逻辑处理2,对eno=101操作,完毕解锁
  //逻辑处理3
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值