zoukankan      html  css  js  c++  java
  • spring之事务总结

    事务定义

    事务(transaction),一般是指要做的或者所做的事情。在程序中,尤其是在操作数据库的程序中,指的是访问并且可能更新数据库中数据项的一个执行单元(unit),这个执行单元由事务开始(begin transaction)和事务结束(end transaction)之间执行的全部操作组成。

    事务特性(ACID原则)【记住】

    事务具有4个基本特性:原子性、一致性、隔离性、持久性。也就是我们常说的ACID原则。

    原子性(Atomicity):一个事务已经是一个不可再分割的工作单位。事务中的全部操作要么都做;要么都不做。

    一致性(Consistency):事务必须是使得数据库状态从一个一致性状态,转变到另外一个一致性状态。也就是说在事务前,和事务后,被操作的目标资源状态一致。比如银行转账案例中,转账前和转账后,总账不变。

    隔离性(Isolation):一个事务的执行不能被其他事务的影响。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,多个并发事务之间不能相互干扰。

    持久性(Durability):一个事务一旦提交,它对数据库中数据的改变会永久存储起来。其他操作不会对它产生影响。

    spring事务控制中需要明确的事项

    第一件事

    j2EE体系中项目按照分层进行设计开发,有表现层、业务层、持久层。事务处理位于业务层。spring提供了分层设计业务层的事务处理解决方案。

    第二件事

    spring框架为我们提供了一组事务控制接口,该组接口位于spring-tx-xxx.RELEASE.jar包中

    第三件事

    spring的事务都是基于AOP的实现,它既可以使用编程的方式实现,也可以使用配置的方式实现。我们这里重点是使用配置的方式来实现。

    spring事务控制器的API介绍

    1.PlatformTransactionManager

    2.TransactionDefinition

    事务隔离级别 【理解】

    说明:事务隔离级别,反应了事务在并发访问时的处理态度。

    ISOLATION_DEFAULT:

    默认级别,归属于下列某一种隔离级别。在项目中使用默认值即可。

    ISOLATION_READ_UNCOMMITTED:

    可以读取其他事务未提交的数据(脏读)

    ISOLATION_READ_COMMITTED:

    只读取其他事务已经提交的数据,解决脏读的问题。有可能两次读取不一致的问题,不可重复读(oracle数据库默认级别)

    ISOLATION_REPEATABLE_READ:

    是否读取其他事务提交修改后的数据,解决不可重复读的问题。保证两次读取一致,可重复读(mysql数据库默认级别)

    ISOLATION_SERIALIZABLE:

    是否读取其他事务添加后的数据,解决幻影读的问题

    细节:

    1.事务级别从低到高:脏读->不可重复读->可重复读->解决幻读

    2.事务级别越高,数据越安全,消耗的资源越多,数据库操作性能越低

    3.在企业项目中,使用哪一种级别的事务,需要根据业务需求来确定

    事务传播行为【理解】

    说明:事务传播行为,决定在不同的执行环境中,事务该如何传递。

    REQUIRED:

    如果已经有事务,就加入该事务中执行;如果没有事务,则新建一个事务。对应增/删/改操作(默认值)

    SUPPORTS:

    如果已经有事务,支持当前事务的执行;如果没有事务,就以非事务的方式执行。对应查询操作

    MANDATORY:

    要求在事务环境下执行,如果当前没有事务,则抛出异常

    REQUIRES_NEW:

    新建事务,如果当前已经存在事务,则把当前事务挂起

    NOT_SUPPORTED:

    以非事务方式执行,如果当前有事务,则把当前事务挂起

    NEVER:

    以非事务方式执行,如果当前有事务,则抛出异常

    NESTED:

    如果当前已经有事务,嵌套在当前事务中执行;如果当前没有事务,则类似于REQUIRED操作

    事务的传播行为

    public class transactionPropragation{

    public void m1(){// 该方法没有事务

    }

    public void m2(){// 该方法有事务

    // m2中调用m1()
    m1();// 请求m1有没有事务???

    }

    public void m3(){// 没有事务

    // m3调用m1
    m1();

    }


    }

    4.5.TransactionStatus

    存储点:

    存储过程结构:
    create or replace procuder pro

    is

    begin
    save1:
    // 记录用户操作日志

    save2:
    // 操作商品表

    save3:
    // 操作订单表

    save4:
    // 操作支付表

    end;

    事务超时时间

    以秒为单位进行设置。如果设置为-1(默认值),表示没有超时限制。在企业项目中使用默认值即可。

     是否只读事务

    只读事务比读写事务性能要高,实际项目中,查询一般建议设置为只读。

    TransactionStatus

    它是一个接口,提供了事务具体的执行状态,描述了某一个时间点上事务对象的状态信息。

  • 相关阅读:
    Entity Framework 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭 异常处理
    MD5加密
    让AutoMapper在你的项目里飞一会儿
    C# SFTP上传与下载
    读取、修改配置文件节点
    C#对数据库的操作(增删改查)
    实现Icommand接口
    wpf创建用户控件(计时器控件)
    用lpeg解析文本语法
    一种简单的客户端更新方案
  • 原文地址:https://www.cnblogs.com/Jeremy95-Sze/p/13097714.html
Copyright © 2011-2022 走看看