spring实战学习(六)事务管理

什么是事务?

在软件领域,我们将一组要么全部执行要么全不执行的操作叫做事物。

事务的四个特性(ACID)
原子性(atomicity):原子性确保了事物中的操作像原子操作一样要就全部执行或全不执行,如果有一个操作失败,事务回滚。
一致性(consistency):数据在执行操作前后保持一致。
隔离性(isolation):但多个用户同时操作相同的数据时,事务保证它们互不影响。
持久性(durability):事物一旦完成,数据的结果会持久存在,一般是存储在数据库或其他持久化存储中。

事务管理器
spring并不直接管理事务,它提供了多种事务管理器。它们将事务管理的职责委托给像JTA或其他一些持久化框架。
它提供了PlatformTransactionManager这个事务管理器接口,其他持久化框架可以实现接口

Public interface PlatformTransactionManager(){  
    TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; 
    Void commit(TransactionStatus status) throws TransactionException;  
    Void rollback(TransactionStatus status) throws TransactionException;  
    } 

一些持久化平台的实现
jdbc: DataSourcetransactionmanager
Hibernate:Hibernatetransactionmanager
JPA:Jpatransactionmanager
JTA:Jtatransactionmanager

事务的五方面属性

传播行为

PROPAGATION_REQUIRED支持当前事务,如果不存在 就新建一个(默认)(常用)
PROPAGATION_SUPPORTS支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY支持当前事务,如果不存在,抛出异常
PROPAGATION_REQUIRES_NEW如果有事务存在,挂起当前事务,创建一个新的事务(常用)
PROPAGATION_NOT_SUPPORTED以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED如果当前事务存在,则嵌套事务执行

隔离级别
可以理解为一个事务受到其他并发事务影响程度

首先并发过程中可能出现的问题
脏读:一个事务读取了另一个事务改写还未提交的数据,此时这次改写被回滚了,那么第一个事务读取的数据就没有意义,这就是脏读。
不可重复读:一个事务两次或以上读取同一个数据,得到不同结果,因为另一个事务在此时修改了数据。
幻读:一个事务读取了几行数据,此时另一个事物插入了一些数据,在之后第一个事务就会发现多了几行不存在的数据

ISOLATION_DEFAULT:使用数据库默认的事务隔离级别. (ISOLATION_REPEATABLE_READ)
ISOLATION_READ_UNCOMMITTED:此时脏读,不可重复读,幻读都可能发生。
ISOLATION_READ_COMMITTED:不可重复读,幻读可能发生。
ISOLATION_REPEATABLE_READ:幻读可能发生
ISOLATION_SERIALIZABLE:避免所有问题,最高级别,但是一般用锁定事务相关数据库表的方式实现,所以会导致性能很慢

只读
这是声明式事务的第三个属性,如果事务只对后端的数据库进行读操作,数据库可以利用事务的只读特性来进行一些特定的优化。通过将事务设置为只读,你就可以给数据库一个机会,让它应用它认为合适的优化措施。

事务超时
避免事务运行太长时间,因为事务会占用数据库资源,你可以设置一个特定的秒数,如果时间到了还没有执行完,事务就会回滚。

回滚规则
你可以定义事务在遇到哪些异常时回滚,遇到哪些异常时不会滚,默认运行期异常回滚。

在xml中声明一个事务
首先要导入tx这个包,它还会依赖spring的aop一些属性,所以还需要导入aop的包

<tx:advice id="txAdvice">
     <tx:attributes>
          <tx:method name="add*" propagation="REQUIRED"/>//定义add开头的方法
          <tx:method name="*" propagation="SUPPORTS"   read-only="true"/>//定义其他方法,这其中可以设置事务的五个属性
     </tx:attributes>
 </tx:advice>      

使用注解声明一个事务

<tx:annotation-driven>//在xml中声明这行即可

这时spring会查找上下文中所有@Transactiona注解的Bean,事务属性通过注解的参数来实现

@Transactional(propagation=Propagation.REQUIRED,
            isolation=Isolation.READ_COMMITTED,
            readOnly=false, timeout=1)//大概这样
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值