精华内容
下载资源
问答
  • SpringMVC+ibatis数据库事务控制

    千次阅读 2015-12-08 16:59:42
    就需要写大量的数据库事务操作。之前一直没有比较好的方式,直接在dao层侵入的方式进行,虽然该方式可以实现事务的管理,但是总觉得有些问题。实现方式如下: public int insert(ChuxinRecord t) { SqlMapClient ...

    由于在系统中使用了关联表,逻辑上是关联的,实际数据库并没有做外键。就需要写大量的数据库事务操作。之前一直没有比较好的方式,直接在dao层侵入的方式进行,虽然该方式可以实现事务的管理,但是总觉得有些问题。实现方式如下:

        public int insert(ChuxinRecord t) {
            SqlMapClient sqlMapClient = getWriteTemplate().getSqlMapClient();
            try {
                sqlMapClient.startTransaction();
                sqlMapClient.getCurrentConnection().setAutoCommit(false);
                Object obj = sqlMapClient.insert("chuxin_record.insertEntry",t);
                //更新频道信息
                ChuxinChannel channel = new ChuxinChannel();
                channel.setId(t.getChannelId());
    //          channel.setRecordNum(channel.getRecordNum()==null?1:(channel.getRecordNum()+1));
    sqlMapClient.update("chuxin_channel.updateEntryByKey", channel);
                sqlMapClient.update("chuxin_channel.addOneRecord", t.getChannelId());
                //更新未读消息数量
                sqlMapClient.update("chuxin_user_channel.addOneRecordNum", t.getChannelId());
                sqlMapClient.commitTransaction();
                sqlMapClient.getCurrentConnection().commit();
                if (null!=obj) {
                    return (Integer)obj;
                }
                return 0;
            } catch (Exception e) {
                logger.error("执行错误", e);
                try {
                    sqlMapClient.getCurrentConnection().rollback();
                } catch (SQLException e1) {
                    logger.error("事物回滚错误", e);
                }
            } finally {
                try {
                    sqlMapClient.endTransaction();
                    if (null != sqlMapClient.getCurrentConnection()) {
                        sqlMapClient.getCurrentConnection().close();
                    }
                } catch (SQLException e) {
                    logger.error("关闭事物错误", e);
                }
            }
            return 0;
        }

    从以上代码可以看出我们通过显示的方式进行控制,这样很多逻辑就会写在dao层,逻辑复杂,实用性不强。
    那么什么是更好的方式那?利用切面的方式控制。

    1. 在ctx-dao.xml 文件中配置切面

    <!--配置哪些方法,什么情况下需要回滚-->  
        <tx:advice id="serviceAdvice" transaction-manager="transactionManager">   
            <tx:attributes>
                <!--当代理的service层中的方法抛出异常的时候才回滚,必须加rollback-for参数-->  
                <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.RuntionException"/>  
                <tx:method name="del*" propagation="REQUIRED" rollback-for="java.lang.RuntionException"/>   
                <tx:method name="update*" propagation="REQUIRED" rollback-for="Throwable"/>   
                <tx:method name="tran*" propagation="REQUIRED" rollback-for="java.lang.RuntionException"/>   
                <!--除了上面标识的方法,其他方法全是只读方法-->  
                <tx:method name="*" read-only="true"/>   
            </tx:attributes>   
        </tx:advice>   
        <!-- 配置哪些类的方法需要进行事务管理 -->   
        <aop:config proxy-target-class="true">   
            <aop:pointcut id="servicePointcut" expression="execution(* com.hdd.service.impl.*.*(..))"/>   
            <aop:advisor pointcut-ref="servicePointcut" advice-ref="serviceAdvice"/>   
        </aop:config>  

    我们定义了需要测试的方式为tran*开头的方法

     <tx:method name="tran*" propagation="REQUIRED" rollback-for="java.lang.RuntionException"/> 

    观察在定义中有句:

    rollback-for="java.lang.RuntionException"

    该句话非常关键,会涉及到是否会回滚事务。之前配置很多一直没有注意这点,所以每次测试的时候事务总错误,并没有回滚。
    在接口中定义方法:

    void tranTest();

    方法实现:

    @Override
        public void tranTest() {
            try {
                HddAd hddAd = new HddAd();
                hddAd.setAbContent("123456");
                hddAdDao.insert(hddAd);
    
                Feedback feedback = new Feedback();
                feedback.setContactInfo("wwwwwwwwwwwww");
                feedbackDao.insert(feedback);
    
            } catch (Exception e) {
                logger.error("会回滚吗",e);
                throw new RuntimeException(e);
            }
        }

    feedback类的contactInfo属性为8位,在插入过程中肯定会报错。而HddAd类是可以插入成功的。观察,当出现异常的时候,我们会抛出异常RuntimeException

    throw new RuntimeException(e);

    这行代码非常关键,刚好为我们之前在tx定义的rollback-for,这也是触发事务回滚的关键点。
    编写测试类,测试错误时候是否回滚:

    public class Insert {
        public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("ctx-web.xml");
    
            HddAdService hddAdService = (HddAdService)ctx.getBean("hddAdService");
            hddAdService.tranTest();
    
        }
    }

    好了,运行观察事务是否回滚了。

    关于tx相关配置,网上有太多说明,我就不逐个解释了,重点是让他可以顺利的实现预期功能,这是实用主义者的信条。


    参考文档:

    1. http://www.cnblogs.com/hellojava/archive/2012/11/21/2780694.html
    展开全文
  • 数据库事务

    万次阅读 2018-08-18 07:51:35
    数据库事务是数据库运行中的逻辑工作单位,单个逻辑工作单元所执行的一系列操作,要么都执行,要么都不执行。例如银行取款事务分为2个步骤(1)存折减款(2)提取现金,2个步骤必须同时完成或者都不完成。 数据库事务的...

    数据库事务是数据库运行中的逻辑工作单位,单个逻辑工作单元所执行的一系列操作,要么都执行,要么都不执行。例如银行取款事务分为2个步骤(1)存折减款(2)提取现金,2个步骤必须同时完成或者都不完成。

    数据库事务的四大特性(ACID):

    (1) 原子性(Atomicity):
         事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。


    (2)一致性(Consistency) :
        事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。


    (3)分离性(Isolation):
       分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。


    (4)持久性(Durability):
       持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性通过数据库备份和恢复来保证。

     

    • READ UNCOMMITTED:未提交读
      • 事务中的修改,即使没有提交,对其他事务也是可见的
      • 产生的问题:脏读。这里假设两个事务并行:
        • A事务对某个数值a进行修改
        • B事务执行读取该数值a并进行其他修改,依赖于a
        • A事务回滚,发生脏读

     

    • READ COMMITTED:提交读
      • 一个事务中的修改在其提交之前,对于其他事务都是不可见的
      • 产生的问题:不可重复读。这里假设两个事务并行:
        • A事务对某个数值a进行读取,进行计算
        • B事务对数值a进行修改并提交,该修改对于A变为可见
        • A事务再次进行数值a的读取,发生不可重复读

     

    • REPEATABLE READ:可重复读
      • 在一个事务的执行过程中,读到的数据一直是事务开始时的数据
      • 产生的问题:幻读。这里假设两个事务并行:
        • A事务读取某个值a大于1的数据并计算行数
        • B事务插入了一行a为1的数据,并提交
        • A事务再次读取,发现行数不一致,发生幻读

     

    • SERIALIZABLE:可重复读
      • 强制所有事务都并行执行,对于读取的每一行数据都加上锁

     

     

    引入知乎的一篇好文章:

    MySQL的四种事务隔离级别

    展开全文
  • 1.事务(Transaction)是并发控制的基本单位。 所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个...

    1.事务(Transaction)是并发控制的基本单位。

    所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。 。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。


    事务和程序的关系:事务和程序是两个概念。一般地讲,一个程序中包含多个事务。

    针对上面的描述可以看出,事务的提出主要是为了解决并发情况下保持数据一致性的问题。


    2.事务的语句

    在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。 
     开始事务:BEGIN TRANSACTION(事务)
     提交事务:COMMIT TRANSACTION(事务)
     回滚事务:ROLLBACK TRANSACTION(事务)


    3.事务的4个属性

       Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败(减款,增款必须一起完成)。

    ●   Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。事务的运行并不改变数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。

    ●   Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。

    ●   Durability(持久性):事务完成之后,它对于 系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库

    4.事务的保存点

      SAVE TRANSACTION 保存点名称 --自定义保存点的名称和位置
      ROLLBACK TRANSACTION 保存点名称 --回滚到自定义的保存点
    显示事务被用begin transaction 与 end transaction 标识起来,其中的 update 与 delete 语句或者全部执行或者全部不执行。。 如:
    begin transaction T1
    update student
    set name='Tank'
    where id=2006010
    delete from student
    where id=2006011
    commit
    简单地说,事务是一种机制,用以维护数据库的完整性。

    其实现形式就是将普通的SQL语句嵌入到Begin Tran...Commit Tran 中(或完整形式 Begin Transaction...Commit Transaction),当然,必要时还可以使用RollBack Tran 回滚事务,即撤销操作。

    利用事务机制,对数据库的操作要么全部执行,要么全部不执行,保证数据库的一致性。需要使用事务的SQL语句通常是更新和删除操作等。

    end transaction T1

    关于savepoint

    用户在事务(transaction)内可以声明(declare)被称为保存点(savepoint)
    的标记。保存点将一个大事务划分为较小的片断。

    用户可以使用保存点(savepoint)在事务(transaction)内的任意位置作标
    记。之后用户在对事务进行回滚操作(rolling back)时,就可以选择从当前
    执行位置回滚到事务内的任意一个保存点。例如用户可以在一系列复杂的更
    新(update)操作之间插入保存点,如果执行过程中一个语句出现错误,用
    户 可以回滚到错误之前的某个保存点,而不必重新提交所有的语句。

    在开发应用程序时也同样可以使用保存点(savepoint)。如果一个过程
    (procedure)内包含多个函数(function),用户可以在每个函数的开始位置
    创建一个保存点。当一个函数失败时, 就很容易将数据恢复到函数执行之前
    的状态,回滚(roll back)后可以修改参数重新调用函数,或执行相关的错误
    处理。

    当事务(transaction)被回滚(rollback)到某个保存点(savepoint)后,
    Oracle将释放由被回滚语句使用的锁。其他等待被锁资源的事务就可以继续
    执行。需要更新(update)被锁数据行的事务也可以继续执行。

    将事务(transaction)回滚(roll back)到某个保存点(savepoint)的过程如
    下:
    1. Oracle 回滚指定保存点之后的语句
    2. Oracle 保留指定的保存点,但其后创建的保存点都将被清除
    3. Oracle 释放此保存点后获得的表级锁(table lock)与行级锁(row
    lock),但之前的数据锁依然保留。

    被部分回滚的事务(transaction)依然处于活动状态,可以继续执行。

    一个事务(transaction)在等待其他事务的过程中,进行回滚(roll back)到
    某个保存点(savepoint)的操作不会释放行级锁(row lock)。为了避免事务
    因为不能获得锁而被挂起,应在执行 UPDATE 或 DELETE 操作前使用 FOR
    UPDATE ... NOWAIT 语句。(以上内容讲述的是回滚保存点之前所获得的
    锁。而在保存点之后获得的行级锁是会被释放的,同时保存点之后执行的
    SQL 语句也会被完全回滚)。


    转载:https://blog.csdn.net/libaoshan55/article/details/78175415

    展开全文
  • 数据库事务和并发控制

    千次阅读 2016-06-24 09:46:56
    一、数据库事务:  事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是不可分割的一个序列。 事务的特征:(ACID) 1、原子性:事务的操作要么全做要么全不做。 2、一致性:事务操作的结果是...
    一、数据库的事务:
    
      事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是不可分割的一个序列。

    事务的特征:(ACID)
    1、原子性:事务的操作要么全做要么全不做。
    2、一致性:事务操作的结果是一个一致状态转换到另一个一致状态。
    3、隔离性:一个事务的执行过程不能受到其他事务的干扰。
    4、持久性:事务一旦提交,对数据库做出的更新将是永久的。

    二、并发控制:
    并发操作带来的问题:
    1、丢失修改:修改的数据被覆盖
    2、不可重复读:数据被修改或者插入删除,结果不能复现
    3、读脏数据: 脏数据是未提交的数据。

    可串行化调度:
         如果多个事务的并发执行和某一串行执行顺序结果相同,则称为可串行化调度。
    冲突可串行化调度:
         冲突操作:不同事务的读写操作和写写操作。
         不同事务的冲突操作和同一事务的两个操作都不能交换执行顺序。

    并发控制的技术:
    1、时间戳:
         给每个事务分配一个全局的唯一的时间戳,唯一性且单调增长性。时间戳可以为系统时钟值,也可以为逻辑计数器,同一事务中的数据操作有相同的时间戳。此方法需要大量的系统资源。
    2、乐观控制法:
         假设不会发生冲突。读阶段——确认阶段——写阶段。
    3、锁:
         排它锁(X锁):写锁,一个事务获取了写锁,则其他事务都不能再加任何类型的锁,直到锁释放。
         共享锁(S锁):读锁,一个事务获取了读锁,其他事务能加读锁,不能加写锁。
         
        (1) 锁协议:
         1、一级封锁协议:事务在修改数据前先加写锁,直到事务结束。(防止修改)
         2、二级封锁协议:在一级的基础上,事务读数据先加读锁,读完释放读锁。(防止读脏)
         3、三级封锁协议:在一级的基础上,事务读数据先加读锁,直到事务结束释放。(防止不可重复读)
        (2)两端封锁协议:事务执行过程中,不允许加锁释放锁交叉执行。
         1、申请封锁期
         2、释放封锁期
        (3)InnoDB行锁算法:
         行记录锁:
         间隙锁:锁定一个范围。
         next-key lock: 锁定一个范围,并锁定记录。

    锁带来的问题:
    1、活锁:
         某一事务一直在等待锁。采用先来先服务的策略。
    2、死锁:
         事务互相等待锁。
         预防:一次将所有需要的数据全部加锁;规定一个封锁顺序
         诊断死锁并解除:超时法;等待图法,如果有环则有死锁。解除死锁:选择回滚代价最小的事务;回滚多远;避免饿死。

    锁的粒度越大,能够封锁的单元就越少,其并发度越低,系统开销越小。一个系统支持多个封锁粒度供不同的事务选择,叫多粒度封锁。
    多粒度锁协议:对一个结点加锁意味着这个节点的所有后裔节点都被加同样的锁。显示封锁:直接加到数据对象的锁,隐式封锁:该数据对象是由于上级节点加锁而加上的锁。
    意向锁:对任意节点加锁,就必须先对它的上层节点加意向锁。意向共享锁,意向排他所,共享意向排他锁。

    展开全文
  • 数据库并发事务控制 一:综述

    千次阅读 2015-01-28 11:03:36
    数据库的操作都是在事务中进行的。 事务是指一组相互依赖的操作行为。事务中的操作是不可分割的工作单元,由一组在业务逻辑上相互依赖的SQL语句组成,有ACID特征。  Atomic(原子性):事务中包含的操作被看做一...
  • 数据库事务控制和并发控制

    千次阅读 2007-04-29 13:21:00
    数据库事务控制和并发控制1.事务控制 事务是并发控制的基本单位,也是恢复的基本单位。在SQL中支持事务的概念。所谓事务,是用户定义的一个操作序列(集合),这些操作要么都做,要么一个都 不做,是一个不可分割的...
  • Django 数据库事务

    万次阅读 2016-03-30 16:07:46
    管理数据库事务Django框架提供了好几种方式来控制和管理数据库事务。(以下Django框架会简化为Django,读者可自行脑补框架两字)Django框架默认的事务行为自动提交作为Django默认的事务行为,它表现形式为:每次...
  • java积累——数据库手动控制事务工具类

    千次阅读 热门讨论 2016-08-07 11:29:44
     在项目中对数据库操作的时候保证事务的完整性是非常重要的,尤其是一个功能中需要对数据库多次操作的时 候更是需要小心,其实简单的说:只要保证多次操作使用一个Connection就可以使他们在一个事务中,但是...
  • 数据库事务详解

    千次阅读 2017-03-09 20:53:17
    什么是『事务』?事务就是一组具有原子性的操作,这一组操作要么...2. 一致性事务开始前和事务结束后,数据库的完整性约束没有被破坏。3. 隔离性事务的执行是相互独立的,它们不会相互干扰,一个事务不会看到另一个正在
  • Spring中的事务及数据库事务的关系

    千次阅读 2019-06-13 17:23:24
    Spring中的事务及数据库事务的关系 一、MySQL中的事务 如果对MySQL中的事务不了解的话,请先看 基于MySQL 8.0 对事务的深度理解 二、Spring中的事务 Spring管理事务的方式 编程式事务 编程式事务就是利用手动...
  • 数据库 事务级别介绍

    千次阅读 2018-03-30 12:30:54
    数据库 事务级别介绍 2个概念:事务,锁。 事务:逻辑单元内的一系列操作,要么全部完成执行,要么全部不执行。 锁:将某数据的操作加锁,则其他人无法获取当前数据的当前操作。避免单位时间内的数据覆盖,影响...
  • 海翔在数据库管理系统领域的第二本著作《数据库事务处理的艺术:事务管理与并发控制》马上就要出版了,他邀请我写个序,我没有犹豫就欣然答应了。事后,我自己都觉得奇怪会这么痛快,但细细想来,还是有充分理由的。...
  • 日常项目中,经常会出现一个场景,同时批量插入数据库数据,由于逻辑复杂或者其它原因,我们无法使用sql进行批量插入,这个时候我们首先想到多线程并发插入,但是如何控制事务呢 … 直接上干货 实现效果 开启多条子...
  • 数据库事务处理

    千次阅读 2019-03-31 18:21:04
    数据库事务处理 数据库中ACID 事务具有4个基本特征,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Duration) 原子性:事务的原子性是指事务必须是一个原子的操作序列单元。...
  • 数据库 事务的特性ACID

    千次阅读 2014-07-27 09:26:30
    数据库 事务的特性ACID 事务(Transaction)是并发控制的基本单位。... 所谓事务,它是一个操作序列,这些操作要么都执行,要么都不... 数据库事务必须具备ACID特性,ACID是Atomic(原子性)、Consistency(一致
  • 数据库事务管理

    千次阅读 2018-04-09 23:15:49
    事务的概念 事务是访问并可能更新各种数据项的一个程序执行单元。事务有四个基本性质: 1、原子性:事务中的全部操作要么全部做...3、一致性:在没有其他事务并发执行的情况下,保持数据库的一致性 4、持久性:一...
  • 数据库事务的概念 数据并发的问题 数据库锁机制 事务隔离级别 JDBC对事务的支持概述在使用Spring开发应用时,Spring的事务管理可能是被使用最多、应用最广的功能。 Spring不但提供了和底层事务源无关的事务抽象,还...
  • mysql数据库事务类型

    千次阅读 2017-09-25 16:36:01
    数据库事务有不同的隔离级别,不同的隔离级别对锁的使用是不同的,锁的应用最终导致不同事务的隔离级别。 隔离性分为四个级别: 1读未提交:(Read Uncommitted) 2读已提交(Read Committed) 大多数数据库默认的隔离...
  • 数据库事务与特性

    千次阅读 多人点赞 2020-05-24 01:59:51
    事务数据库中的一个概念,在交易系统和复杂业务中经常被提及。对于简单的增删改查场景,特别是学习阶段,不需要考虑诸如并发、锁等问题,但是我们要对事务的概念及特性有所了解,以便日后能够快速定位问题和给出...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 336,631
精华内容 134,652
关键字:

数据库事务控制