精华内容
下载资源
问答
  • thinkjs使用事务

    万次阅读 2020-08-02 23:36:53
    首先需要警告下朋友们,千万别去thinkjs官网群里面去问那些大佬,个别大佬的脾气是真的惹不起系列。比如: 行了,不扯没用的了,但是说实话...1.model中使用手工操作事务 async addData(data) { // 如果添加成功则 c

    首先需要警告下朋友们,千万别去thinkjs官网群里面去问那些大佬,个别大佬的脾气是真的惹不起系列。比如:


    在这里插入图片描述
    在这里插入图片描述

    行了,不扯没用的了,但是说实话真的是在官网群里面被气死了。【手动微笑】

    下文当中有任何疑问问题请在评论区评论,笔者会在第一时间回复。或者进入笔者技术交流群互动:react:815413387,vue:942347564,JAVA:830645840。

    1.model中使用手工操作事务

    async addData(data) {
      // 如果添加成功则 commit,失败则 rollback
      try {
        await this.startTrans();
        const result = await this.add(data);
        await this.commit();
        return result;
      } catch(e){
        await this.rollback();
      }
    }
    

    2.model中使用transaction

    async updateData(data){
      const result = await this.transaction(async () => {
        const insertId = await this.add(data);
        // 通过 db 方法让 other_model 模型复用当前模型的数据库连接
        const otherModel = this.model('other_model').db(this.db());
        const addRes = await otherModel.add({user_id: insertId, cate_id: 100});
        return addRes;
      })
    }
    

    3.controller中使用手工操作事务

    async xxxAction() {
    	const data = this.post();
    	// 一定要保证三个或N个在一次连接中进行
    	const salesRecord = this.ctx.model('sales_record');
    	const salesRecordItem = this.ctx.model('sales_record_item').db(salesRecord.db());
    	const members = this.ctx.model('members').db(salesRecord.db());
    	
    	// 使用try catch捕捉错误
    	try {
    	  await salesRecord.startTrans(); // 开启事务
    	  const submitRecordRes = await salesRecord.submitSalesRecord(data);
    	  await salesRecordItem.addMany(data.items);
    	  await salesRecord.commit(); // 一切正常就提交
    	} catch (e) {
    	  await salesRecord.rollback(); // 出错了就rollback
    	}
    }
    

    4.controller中使用transaction

    async xxxAction() {
    	const data = this.post();
    	// 一定要保证三个或N个在一次连接中进行
    	const salesRecord = this.ctx.model('sales_record');
    	const salesRecordItem = this.ctx.model('sales_record_item').db(salesRecord.db());
    	const members = this.ctx.model('members').db(salesRecord.db());
    	
    	// 开始事务
    	await salesRecord.transaction(async() => {
    	  // 捕捉异常
          try {
            await members.updateMember(data);
            await salesRecord.submitSalesRecord(data);
            // 提交最后的结果,如果最后成功了那就会执行commit,失败了会rollback
            return await salesRecordItem.addMany(data.items);
          } catch (e) { // 出错了就rollback
            await salesRecord.rollback();
          }
        });
    }
    

    查看最后的结果

    这是成功了走的commit
    在这里插入图片描述
    这是失败了走的rollback
    在这里插入图片描述

    有啥问题评论区交流吧~

    展开全文
  • 今天在csdn上看到一个特别有趣的话题,hibernate3为什么必须使用事务才能保存对象,我相信这个问题对很多人来说都非常困惑包括我自己,于是挂上hibernate源码,一直跟踪最底层,也没发现什么,然而正是因为没用发现...

        今天在csdn上看到一个特别有趣的话题,hibernate3为什么必须使用事务才能保存对象,我相信这个问题对很多人来说都非常困惑包括我自己,于是挂上hibernate源码,一直跟踪最底层,也没发现什么,然而正是因为没用发现什么才点醒了我,回忆多年前使用经典jdbc的场景,那时候使用事务必须自己手工控制conn.setAutoCommit(false); 才行。而现在如果我们要正常使用hibernate3保存对象的话要使用事务处理才行:

    	public static void main(String[] args) throws Exception {
    		SessionFactory sf = HibernateSessionFactory.getSessionFactory();
    		Session session = sf.openSession();
    		session.beginTransaction();
    		User u = new User();
    		u.setName("aaa");
    		session.save(u);
    		session.getTransaction().commit();
    	}
    
    使用spring声明式事务本质上和上面是一样的,spring只不过是利用了动态代理而已。 从上面代码可以看到beginTransaction非常像很久以前我们写的conn.setAutoCommit(false); 而session.getTransaction().commit();则是对应conn.commit();那会不会是因为conn已经默认是false了呢
    System.out.println(session.connection().getAutoCommit());//经测试果然如此。经测试下面代码可以成功保存对象。
    		SessionFactory sf = HibernateSessionFactory.getSessionFactory();
    		Session session = sf.openSession();
    		System.out.println(session.connection().getAutoCommit());
    		session.connection().setAutoCommit(true);
    		User u = new User();
    		u.setName("aaa");
    		session.save(u);

    只要修改conn默认的提交方式就可以了,为了进一步验证这个问题其实和hibernate是无关的,写了如下测试代码,同样可以正常的保存对象。

    public static void main(String[] args) throws Exception {
    		Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
    		Connection conn = DriverManager.getConnection(
    				"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs",
    				"sa", "11111111");
    		SessionFactory sf = HibernateSessionFactory.getSessionFactory();
    		Session session = sf.openSession(conn);
    		System.out.println(session.connection().getAutoCommit());
    		// session.connection().setAutoCommit(true);
    		User u = new User();
    		u.setName("aaa");
    		session.save(u);
    	}

     

    其实我觉得必须使用事务才能保存对象是大家对hibernate的误解,目前流行的数据库连接池默认的情况下都是conn自动提交为false的。很多连接池还可以灵活的配置,我们还是要还hibernate清白的。这是取决于数据库连接池的配置。

    展开全文
  • 当需要在存储过程中同时执行多条添加、修改、删除SQL语句时,为了保证数据完整性,我们需要使用事务。使用方式和在PL-SQL中非常相似,但也有一些区别。  --带事务的存储过程 CREATE OR REPLACE PROCEDURE ...

     

    Oracle基础 存储过程和事务

    一、事务和存储过程

      在存储过程中如何使用事务。当需要在存储过程中同时执行多条添加、修改、删除SQL语句时,为了保证数据完整性,我们需要使用事务。使用方式和在PL-SQL中非常相似,但也有一些区别。  

    复制代码

    --带事务的存储过程
    CREATE OR REPLACE PROCEDURE Account_zhuanzhang(fromuser NUMBER,touser NUMBER,money NUMBER) IS
    BEGIN
        UPDATE account SET balance = balance - money WHERE id = fromuser;
        UPDATE account SET balance = balance + money WHERE id = touser;
        COMMIT;
    EXCEPTION
      WHEN OTHERS THEN
        dbms_output.put_line('转账失败');
        ROLLBACK;
    END Account_zhuanzhang;

    复制代码

    调用事务

    复制代码

    SELECT * FROM ACCOUNT;
    DECLARE 
      fromuser NUMBER := 1;
      touser NUMBER := 2;
      money NUMBER := &m;
    BEGIN
      account_zhuanzhang(fromuser,touser,money);
    END;

    复制代码

     

     

    二、自主事务处理:

      自主事务:是由零一个事务启动的独立事务处理。自主事务处理可以暂停主事务处理,也就是处理自己存储过程内部的事务,当自主事务处理完之后会恢复主事务处理。

      PRAGMA AUTONOMOUS_TRANSACTION;  --定义为自主事务,不受其他事务提交,回滚的影响

      例:

    复制代码

    --自主事务:带参数添加部门信息,最后使用了回滚
    CREATE OR REPLACE PROCEDURE PRO_DEPT_ADD(DEPTNO NUMBER,DNAME VARCHAR2,LOC VARCHAR2) AS
    PRAGMA AUTONOMOUS_TRANSACTION;  --定义为自主事务,不受其他事务提交,回滚影响
    BEGIN
      INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (DEPTNO, DNAME, LOC);
        ROLLBACK;  --自主事务回滚操作,不影响主事务。
    END;

    复制代码

    复制代码

    --主事务,添加部门信息,并调用带参数的自主事务,自己本身提交
    CREATE OR REPLACE PROCEDURE PRO_DEPT_ADD2 AS
    BEGIN
      INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (60, 'test1', 'test2');
      PRO_DEPT_ADD(70, 'test', 'test');     --如果调用的事务回滚,如果不是自主事务当前存储过程中插入数据也要一起回滚。但是添加了自主事务后,自主事务提交内容不会影响到当前存储过程
      COMMIT;
    END;

    复制代码

    调用主事务:

    BEGIN
          pro_dept_add2();  --调用完毕后,为60的部门插入成功,但是为70的部门信息回滚了。只有一条插入成功!
    END;

     

      总结自主事务:

      1、自主事务处理结果的变化不依赖于主事务处理的状态或最终配置。

      2、自主事务处理提交或回滚时,不影响主事务处理的结果。

      3、自主事务提交一旦提交,该自主事务处理结果的变化对于其他事务处理就是课件的。这意味着,用于可以访问已更新的信息,无需等待主事务处理提交。

      4、自主事务处理可以启动其它自主事务处理。

     

    分类: Oracle

    标签: oracle

    好文要顶 关注我 收藏该文  

    Builder
    关注 - 17
    粉丝 - 51

    +加关注

    1

    1

    « 上一篇:Oracle基础 存储过程和游标
    » 下一篇:Oracle基础 自定义函数

    https://www.cnblogs.com/zhengcheng/p/4217531.html

     

     

     

     

    存储过程中如何使用事务Transaction

    学习也休闲 学习也休闲 2014-08-16 13:21:54

    一、Begin Trans、Rollback Trans、Commit Trans方法


    1、用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。


    2、事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。



    二、存储过程中使用事务Transaction实例


     Declare @id int
        BEGIN TRANSACTION
       
           Insert into xxxxxTable(f1,f2)values(@a,@b)
           Select @id=@@identity
            Insert into abcTable(ff1,ff2,ff3)values(@c,@id,@dd)

            IF @@error <> 0 --发生错误
            BEGIN
                ROLLBACK TRANSACTION
                RETURN 0
            END
            ELSE
            BEGIN
                COMMIT TRANSACTION
                RETURN 1 --执行成功
           END



    参考资料: 存储过程中使用事务Transaction http://www.studyofnet.com/news/551.html

    存储过程 事务 Transaction

    https://www.douban.com/note/395757588/

     

    展开全文
  • 什么时候使用mysql事务

    千次阅读 2017-01-12 20:41:35
    突然想到一个问题,mysql中我们经常用到事务,比如一次向几张表插入内容,如果中间出错了可以回滚,但是实际开发中,像这种一次可能向多个数据表写入数据的情况,并没有采用事务。   比如一件商品表单,有...

    突然想到一个问题,mysql中我们经常用到事务,比如一次向几张表插入内容,如果中间出错了可以回滚,但是实际开发中,像这种一次可能向多个数据表写入数据的情况,并没有采用事务。

     

    比如一件商品表单,有商品基本信息,商品sku(颜色尺寸价格库存),商家信息,店铺信息,提交的时候是向不同的表插入或更新数据,并且都是等第一张表插入(或更新)完了,然后第二张表,第三张表。。。

    如果中间某个过程突然中断了,只向前一张表成功插入了数据,而后面的程序没有执行,不怕出现这种情况吗?

    再比如,文章表一般设计两张表,一张文章基本信息表,一张文章详情表,大内容放详情表,插入和读取数据也是分两步,也一般不用事务。

    我用到事务的一个地方是在一个广告联盟系统,根据接口数据计算广告费用并记录到广告报表,同时更新记录到用户收益表,年统计表等,用了事务,中间某个过程出错就回滚。

    为什么有的地方用事务,有的地方不用事务,使用事务的场景是什么?

    以下是V2EX网友的回答节选:

    lianyue:设计金额 方便 或对数据准确性要求特稿 并且是多表才需要事务 需要的地方很少很少
    1 商品 插入优先 基本信息 然后 扩展信息 插入基本信息后才插入扩展信息 比如 颜色尺寸 插入失败大不了 没库存 重新编辑下就好了 失败率很低很低的

    2 文章也是 大不了文章没内容

    3 广告联盟 广告报表 可以直接用计划任务 定时统计下就好了 每次有浏览都更新2个表么
    比如每天凌晨后统计昨天的数据 看今天的数据直接 count 查询统计就好了 不需要事务

    kchum:OLTP(On_line Transaction Processing 联机事务处理) 和 OLAP(OLAP:On_line Analytical Processing 联机分析处理) 的区别。
    关于银行金融,特别是涉及金钱的,当然要用事务。
    按照范式来说,确定应该保持数据的一致性,原子性。
    但我们在项目中为了性能,或者其他因素(lan)还不是严格对待。
    以上是我的见解

    我的理解是:比如一篇文章标题、作者等基本属性在一张表,内容等其他的在另一张表,填好表单提交的时候,不会因为第二张表没有插入数据而影响到后面的数据添加,就算内容没有发出去,可以在后台重新编辑保持即可。但是涉及到非常重要的领域,如金融,或者不能再次重新编辑的情况,要使用事务严格控制流程。

    展开全文
  • 环境: Springboot:2.2.3.RELEASE Spring:5.2.3.RELEASE 验证完事务传播的7大机制,想起来曾经遇到的一个问题,关于事务不生效的问题。...首先分析事务管理的本质是什么,Aop!关键是代理对象!...
  • 为什么事务普遍加在service层

    千次阅读 2019-06-12 17:15:18
    结合事务的四大特性(ACID),即可很好的解释为什么加在service层。首先,如果事务注解@Transactional加在dao层,那么只要与数据库做增删改,就需要提交一次事务;如此做事务的特性就发挥不出来,特别是事务的一致...
  • 为什么需要用事务

    千次阅读 2017-12-09 10:51:43
    为什么需要事务? 我们还是从最经典的例子中讲解吧:转账 需求:jeff 给jack 转账1000元 假设转账分为两部完成 1. jeff减少1000 update test set money = money -500 where name= ‘jeff’ 2. jack增加1000 ...
  • 事务模板接入(spring的编程式事务)

    万次阅读 多人点赞 2019-07-31 18:35:32
    事务模板接入 这里接入的是spring的编程式事务,代理一下spring的TransactionTemplate就可以了。 importorg.springframework.transaction.TransactionException; importorg.springframework.transaction....
  • 事务ACID理解

    万次阅读 多人点赞 2018-09-06 21:26:20
    事务管理(ACID) 谈到事务一般都是以下四点 原子性(Atomicity) ...事务的隔离性是多个用户并发访问数据库时,数据库每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔...
  • RocketMq 事务消息使用

    千次阅读 2019-05-26 23:01:53
    由于消息从producer发送出去到最终被消费者消费,中间需要经过mq的服务器进行中转,在rocketMq中即broker,rabbitmq中为exchange,意思差不多,这样一来消息的投递就有了不确定性,因此在rocketMq中,引入了事务性...
  • PHP 使用事务

    千次阅读 2019-03-24 18:32:41
    在某些程序在执行的时候需要进行多个动作,而我们的业务要求是某个动作在执行错误的时候该进程所有的动作都不再执行,全部执行成功才算成功,否则就回到执行之前的状态,这就需要用到事务的处理。 原生代码如下: &...
  • Spring事务管理-使用注解配置事务

    万次阅读 2015-06-17 20:52:13
    Spring Framework对事务管理提供了一致的抽象,其特点如下:不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式...
  • 事务如何使用

    千次阅读 2018-05-21 20:37:04
    事务是一个很神奇的东西 什么叫做事务呢 就是同时可以执行多个语句 一旦有一个错误 就不能运行下去 例如我们需要做一些批量的操作并且同时执行 如果我们用其他方法 例如判断的话 那么就回一直判断 如果数据多的...
  • Ibatis使用事务

    千次阅读 2011-12-12 16:04:21
    在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等。 二、事务属性 事务4大属性: 1 原子性(Atomicity...
  • Linq使用事务

    千次阅读 2011-01-25 10:06:00
      事务是一个原子的工作单位,必须完整的完成单位里的所有工作,要么全部执行,要么全部都不执行。如果提交事务,则事务执行成功;... 使用TransactionScope创建轻量级事务 给DataC
  • SpringBoot中使用事务

    千次阅读 2018-02-07 15:56:14
    Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。 关于事务管理器,不管是JPA还是JDBC等都实现自接口...
  • Spring Boot 事务使用

    万次阅读 多人点赞 2016-01-27 17:26:52
    Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。关于事务管理器,不管是JPA还是JDBC等都实现自接口 ...
  • 所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行,在关系数据库中,一个...
  • Spring Boot 中使用 @Transactional 注解配置事务管理

    万次阅读 多人点赞 2017-11-29 21:15:06
    Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑...
  • Spring事务和MySQL事务详解面试

    万次阅读 多人点赞 2020-09-10 23:56:36
    文章目录数据库事务事务什么事务的四大特性MySQL事务隔离级别查看MySQL当前事务隔离级别MySQL默认操作模式自动提交模式JDBC处理事务Spring事务Spring的事务传播PROPAGATION_REQUIREDPROPAGATION_...
  • Select 为什么需要事务

    千次阅读 2012-10-26 16:16:49
    Session s = factory.openSession();  Transaction tx = s.beginTransaction();  List auctions = s.createQuery("select ...").list();...如果你一次执行单条查询语句,则没有必要启用事务支持,数据库默认支持SQL
  • 事务

    千次阅读 2019-03-23 17:13:47
    Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务 1、JDBC事务 JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工...
  • Laravel 中使用事务

    千次阅读 2020-05-13 13:48:52
    1、transaction 方法 DB::transaction(function () { DB::table('users')->...你也可以通过 rollBack 方法来还原事务: DB::rollBack(); 最后,可以通过 commit 方法来提交这个事务: DB::commit();
  • 什么事务?2.事务的基本操作2.事务操作的注意事项3.事务的隔离级别3.1 无隔离性的问题3.1.1 脏读3.1.2 不可重复读3.1.3 幻读3.2 事务的隔离级别3.2.1 设置事务的隔离级别3.2.2 查看当前的隔离级别4.事务的特性4.1 ...
  • mysql事务使用

    千次阅读 2019-04-04 11:26:05
    本文实验的测试环境:Windows 10+cmd+...事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。  2、一...
  • Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。 关于事务管理器,不管是JPA还是JDBC等都实现自接口 ...
  • 聊一聊使用事务时(@Transactional)可能出现的问题

    千次阅读 多人点赞 2020-08-20 08:11:31
    介绍了在使用Spring事务中可能碰到的各种问题。例如事务失效、事务回滚异常、读写分离下事务如何处理等
  • 事务简介:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性事务就是一系列的动作,它们被当作一个单独的工作单元。这些动作要么全部完成,要么全部不起作用事务的四个关键属性(ACID)①...
  • Java中的事务使用

    万次阅读 多人点赞 2018-09-19 16:43:36
    什么事务事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 945,367
精华内容 378,146
关键字:

为什么使用事务