事务

数据库事务基础

醉酒当歌 提交于 2021-02-18 06:15:43
一、概述 1.事务概念 在数据库中,事务是指一组逻辑工作单元执行的一系列动作,要么都执行,要么都不执行。 2.事务ACID特性 原子性(Atomic) 原子性是指组成一个事务的多个数据库操作是一个不可分割的原子单元,事务中的操作要么都发生,要么都不发生。 一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态 (数据不被破坏) 。如从A账户转账100元到B账户,不管操作成功与否,A和B的存款总额是不变的。 隔离性(Isolation) 在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对对方产生干扰。准确地说,并非要求做到完全无干扰,数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性越好,但并发性越弱。 持久性(Durabiliy) 一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。 在这些事务特性中,数据“一致性”是最终目标,其他的特性都是为达到这个目标的措施、要求或手段。 数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。此外,对于已经提交的事务,即使数据库崩溃

spring 事务传播机制

夙愿已清 提交于 2020-11-26 02:54:52
事务传播行为类型 说明 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是 最常见的选择。 PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。 PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。 1当前有事务 1.1 一个事务 t1 传播行为 PROPAGATION_REQUIRED 1.2 另一个事务 t2 传播行为 PROPAGATION_REQUIRES_NEW 结论:(1)事务执行顺序 先t1后t2 当t2 抛错回滚,t1也会被回滚 (2)事务执行顺序 先t2后t1 当t1报错回滚 t2不回滚 来源: oschina 链接: https://my.oschina.net/u

MySQL存储过程之事务管理

左心房为你撑大大i 提交于 2020-04-14 04:38:07
【今日推荐】:为什么一到面试就懵逼!>>> MySQL存储过程之事务管理 ACID:Atomic、Consistent、Isolated、Durable 存储程序提供了一个绝佳的机制来定义、封装和管理事务。 1,MySQL的事务支持 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: Java代码 MyISAM:不支持事务,用于只读程序提高性能 InnoDB:支持ACID事务、行级锁、并发 Berkeley DB:支持事务 隔离级别: 隔离级别决定了一个session中的事务可能对另一个session的影响、并发session对数据库的操作、一个session中所见数据的一致性 ANSI标准定义了4个隔离级别,MySQL的InnoDB都支持: Java代码 READ UNCOMMITTED:最低级别的隔离,通常又称为dirty read,它允许一个事务读取还没commit的数据,这样可能会提高性能,但是dirty read可能不是我们想要的 READ COMMITTED:在一个事务中只允许已经commit的记录可见,如果session中select还在查询中,另一session此时insert一条记录,则新添加的数据不可见 REPEATABLE READ:在一个事务开始后,其他session对数据库的修改在本事务中不可见

rocketMq 事务消息

↘锁芯ラ 提交于 2020-04-08 14:35:09
事务消息 实现TransactionListener package com.topnet.demo.mq.Transaction; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import org.apache.rocketmq.client.producer.LocalTransactionState; import org.apache.rocketmq.client.producer.TransactionListener; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.remoting.common.RemotingHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.alibaba.fastjson.JSON;

悲观并发 乐观并发 Entity Framework Core中的并发处理

那年仲夏 提交于 2020-04-08 08:23:57
悲观并发策略 A用户发起一个请求 开启了事务 查询到了某一条数据 进行修改 在A提交事务之前 其他人都不能对这条数据进行修改 这种策略最常见的一个问题就是死锁 比如A修改X记录,B修改Y记录,他们分别锁死了这两条记录,但是X和Y记录是相关的,A修改X的时候发现需要修改Y,但是Y又被锁定了,B修改Y的时候需要修改X,但是X也已经被锁定了,这样就产生了死锁问题 产生死锁的条件 1.一定基于多线程 2.锁内部用到了其他加锁的资源 乐观并发策略 A用户发起一个请求 开启了事务 查询到了某一条数据 进行修改 在A提交事务之前 其他人也可以对这条数据进行修改 但是A提交事务的时候 会判断这条记录是否给修改 如果给修改过 就报错 可以通过给实体加版本号实现 在提交事务的时候 会对比当前修改后的实体版本号跟数据库中实体的版本号 只有提交版本号大于数据库的记录版本号才会修改成功 否则就抛出异常 http://www.cnblogs.com/GuZhenYin/p/7761352.html https://blog.csdn.net/qq_34337272/article/details/81072874 来源: https://www.cnblogs.com/jiangchengbiao/p/10454576.html

MVC 事务的使用方法

て烟熏妆下的殇ゞ 提交于 2020-04-08 08:01:33
有时候我们进行的数据操作很多。 如果代码出错了,就会导致一部分操作执行了,一部分没有执行 这样肯定是不行的。要么全都执行,要么全都不执行。所以就要用到事务; 事务通常是再sql写(个人觉得比较难),但是MVC也有事务,非常简单: TransactionScope 需要引用 using System.Transactions命名空间 using (TransactionScope ts = new TransactionScope()) {   。。。。   里面写需要执行的逻辑操作      ts.Complete(); //全部完成 回滚 } 来源: https://www.cnblogs.com/liuzheng0612/p/11453404.html

时势造英雄、仅此怀念伟大人(第十四周)

本秂侑毒 提交于 2020-04-07 14:34:20
一、 导入hellodb.sql生成数据库 1、打开数据库,然后使用mysql uroot -predhat打开数据库; 2、导入数据内容;rz导入hellodb_innodb数据库; 3、导入数据内容,数据库出现hellodb数据库; (1) 在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄; (2) 以ClassID为分组依据,显示每组的平均年龄; (3) 显示第2题中平均年龄大于30的分组及平均年龄; (4) 显示以L开头的名字的同学的信息; 二、数据库授权magedu用户,允许192.168.1.0/24网段可以连接mysql 测试 三、总结mysql常见的存储引擎以及特点。 MyISAM ①不支持事务 ②表级锁定 ③读写相互阻塞,写入不能读,读时不能写 ④只缓存索引 ⑤不支持外键约束 ⑥不支持聚簇索引 ⑦读取数据较快,占用资源较少 ,不支持MVCC(多版本并发控制机制)高并发 ⑧崩溃恢复性较差 ⑨MySQL5.5.5前默认的数据库引擎 ,查询速度快、存储空间小,原因是在磁盘上分成三个文件存储:.frm(存储表定义),.MYD(MYData,存储数据),.MYI(MYIndex,存储索引),SELECT COUNT() FROM TABLE时,避免了全表扫描。 1、MyISAM存储引擎适用场景 只读(或者写较少)、表较小(可以接受长时间进行修复操作)

Spring中事务内部调用引发的惨案

故事扮演 提交于 2020-04-07 05:58:32
在一个类内部有2个方法foo和bar,其中bar方法配有注解(@Transactional),即bar是事务执行的,而foo不是事务执行,当foo方法内部调用bar方法后,bar方法的事务是不生效的。示例代码如下: public class ServiceTest { public void foo(){ this.bar();//调用自身的方法; } @Transactional public void bar(){ System.out.println("this is bar"); //数据库操作 } } 原因如下: Spring中通过注解来完成事务的功能,实际是通过SpringAOP来实现的,而SpringAOP中,使用this来调用自身的方法时 ,此对象引用上的方法 直接会 被调用,不会调用代理的方法(SpringAOP原理是产生代理类)。因此bar方法的事务不会生效。如果直接调用bar方法,此时事务是生效的。 解决方法有: 一、将bar方法放在另一个service类中。这种方法简单,但是造成代码的冗余。 二、可以将注解@Transactional放在foo方法上。这种方法造成的影响:加入foo方法的一些操作是不需要事务的,这会延长事务执行的时间。 三、在foo方法中不要直接使用this来调用bar方法,通过调用代理类的bar方法。 public void foo(){

JMS随笔

浪尽此生 提交于 2020-04-06 11:34:42
Java 消息服务 (JMS) SOA与异步消息传送模型都适合于系统集成: 异步消息传送模型非常适于完成集成复杂系统的任务;对于此类系统,在执行操作的过程中让一个组件为另一个组件提供支持既不切实际,也不值得这样做。尽管异步消息传送放弃了同步系统所具有的某些控制功能,但大大提高了组件间相互作用的灵活性。它还增强了系统的稳定性,因为一个组件的故障并不会导致整个系统瘫痪。 SOA或者WS是主动请求,消息的接收方必须做好准备,这类系统的集成属于 整体一个组件必须为另一个组件提供支持。并且这样就很难做到高密度吞吐量。 消息的格式:标题 属性 主体 属性可以用来过滤消息。避免在消息接收者的应用程序中再去过滤处理。 消息主体可以是对象,字节流,key-value的map等。 创建连接时,将分配通信资源以及验证客户机。这是一个相当重要的对象,大多数客户机均使用一个连接来进行所有的消息传送。 客户机使用消息生产者对象 (MessageProducer) 向指定的物理目标(在 API 中由目标对象destinaction表示)发送消息。 客户机使用消息消费者对象 (MessageConsumer) 从指定的物理目标(在 API 中表示为目标对象destinaction表示)接收消息。共有两种类型的目标,分别是队列和主题 物理目标是在jms服务器上。destinaction只是在客户机上对应的抽象