事务管理

spring的事务管理

匿名 (未验证) 提交于 2019-12-02 23:45:01
Spring事务管理基于底层数据库本身的事务处理机制 事务具备ACID四种特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性) 原子性:事务执行要么全部成功,要么全部失败,不存在第三种状态 一致性:事务完成后,数据库中的变化按期待的那样完成,保证了事务的原子性却不一定能保证一致性 隔离性:并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间,某个并发事务所做的修改必须与任何其他并发事务所做的修改隔离,事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据 持久性:只要事务成功结束,它对数据库所做的更新就必须永久保存下来 事务的传播 多个事务对方法进行调用,如何定义方法间事务的传播,Spring定义了以下几种传播行为(此处只列出了两种.): propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是Spring默认的选择。 propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。 脏读、不可重复读: 脏读指a事务正在访问数据,并且对数据进行了修改,但这种修改还没有提交到数据库中,这时b事务也访问了这个数据

Spring 事务管理

匿名 (未验证) 提交于 2019-12-02 23:34:01
版权声明:最终解释权归属Hern、HernSong(hernsong)、苍鹭、www.hernsong.com所有! https://blog.csdn.net/qq_36761831/article/details/90339544 事务 事务管理是企业级应用程序开发中必不可少的技术 , 用来确保数据的完整性和一致性 . 事务就是一系列的动作 , 它们被当做一个单独的工作单元 . 这些动作要么全部完成 , 要么全部不起作用 事务的四个关键属性 ( ACID ) 原子性 (atomicity): 事务是一个原子操作 , 由一系列动作组成 . 事务的原子性确保动作要么全部完成要么完全不起作用 . 一致性 (consistency): 一旦所有事务动作完成 , 事务就被提交 . 数据和资源就处于一种满足业务规则的一致性状态中 . 隔离性 (isolation): 可能有许多事务会同时处理相同的数据 , 因此每个事物都应该与其他事务隔离开来 , 防止数据损坏 . 持久性 (durability): 一旦事务完成 , 无论发生什么系统错误 , 它的结果都不应该受到影响 . 通常情况下 , 事务的结果被写到持久化存储器中 . 事务管理 作为企业级应用程序框架 , Spring 在不同的事务管理 API 之上定义了一个抽象层 . 而应用程序开发人员不必了解底层的事务管理 API, 就可以使用

非关系型数据库-nosql

匿名 (未验证) 提交于 2019-12-02 23:34:01
Nosql 本篇文章主要介绍Nosql的一些东西,以及Nosql中比较火的三个数据库Redis、Memchache、MongoDb和他们之间的区别。以下是本文章的阅读目录 一、Nosql介绍 1. Nosql简介 2. Nosql的特点和关系型数据库的区别 3. Redis,Memcache,MongoDb的特点与区别 4 .参考文章 1. Nosql介绍 Nosql的全称是Not Only Sql,这个概念早起就有人提出,在09年的时候比较火。Nosql指的是非关系型数据库,而我们常用的都是关系型数据库。就像我们常用的mysql,sqlserver一样,这些数据库一般用来存储重要信息,应对普通的业务是没有问题的。但是,随着互联网的高速发展,传统的关系型数据库在应付超大规模,超大流量以及高并发的时候力不从心。而就在这个时候,Nosql得到的告诉的发展。 2. Nosql和关系型数据库的区别 1.存储方式   关系型数据库是表格式的,因此存储在表的行和列中。他们之间很容易关联协作存储,提取数据很方便。而Nosql数据库则与其相反,他是大块的组合在一起。通常存储在数据集中,就像文档、键值对或者图结构。 2.存储结构   关系型数据库对应的是结构化数据,数据表都预先定义了结构(列的定义),结构描述了数据的形式和内容。这一点对数据建模至关重要,虽然预定义结构带来了可靠性和稳定性

分布式事务二TCC

淺唱寂寞╮ 提交于 2019-12-02 23:24:01
明天再整理 分布式事务解决方案之TCC 4.1.什么是TCC事务 TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try、确认Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作即回滚操作。TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试。 分支事务失败的情况: TCC分为三个阶段: 1. Try 阶段是做业务检查(一致性)及资源预留(隔离),此阶段仅是一个初步操作,它和后续的Confirm 一起才能真正构成一个完整的业务逻辑。 2. Confirm 阶段是做确认提交,Try阶段所有分支事务执行成功后开始执行 Confirm。通常情况下,采用TCC则认为 Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。若Confirm阶段真的出错了,需引入重试机制或人工处理。 3. Cancel 阶段是在业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放。通常情况下,采用TCC则认为Cancel阶段也是一定成功的

mysql数据类型

匿名 (未验证) 提交于 2019-12-02 22:06:11
关系型数据库的常见组件 数据库:database 表:table 行:row 列:column 索引:index 试图:view 用户:user 权限:privilege 存储过程:procedure 存储函数:function 触发器:trigger 事件调度器:event scheduler 错误日志:Error log 默认情况下错误日志大概记录以下几个方面的信息: 1、服务器启动和关闭过程中的信息(未必是错误信息,例如,mysql如何启动INNODB的表空间文件的、如何初始化自己的存储引擎的等) 2、服务器运行过程中的错误信息 3、事件调度器运行一个事件时产生的信息 4、在从服务器上启动服务器进程时产生的信息 注意: 1、可以根据自身需求设定不同错误日志的值 1=只记录 Errors 级别的日志 2=记录Errors、warnings 级别的日志 3=记录Errors、warnings、notes(defaults)级别的日志 2、如何删除旧的错误日志 在mysql5.7之前:数据库管理员可以删除很长时间之前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin命令开启新的错误日志: 命令语法如下:mysqladmin -u root -p flush_logs 也可以登陆mysql数据库中使用flush logs

MySQL之分布式事务

匿名 (未验证) 提交于 2019-12-02 22:06:11
1.分布式事务原理 在MySQL中,使用分布式事务的应用程序涉及一个或多个资源管理器和一个事务管理器 1> 资源管理器(RM) 用于提供通向事务资源的途径 。数据库服务器 是一种 资源管理器 。该管理器必须可以 提交或回滚由RM 管理的事务 。 2> 事务管理器(TM) 用于协调作为一个分布式事务一部分的事务。 TM于管理每个事务的RMs进行通信 。在一个分布式事务中,各个单个事务均是分布式事务的“分支事务”。分布式事务和分支通过一种命名方法进行标记。 MySQL执行分布式的MYSQL的时候,MySQL相当于一个用于管理分布式事务中的分布式事务的资源管理器。于MySQL服务连接的客户端相当于事务管理器。 2.分布式事务分步骤 第一阶段,所有的 分支都被预定 ,即它们被TM(事务管理器)告知要准备提交, 这意味着用于管理分支的每个RM会记录对于被稳定保存的分支的行动。分支指示是否它们可以这么做 。这些结果被用于第二阶段 第二阶段, TM告知RMs是否要提交或回滚 。如果在预备分支时,所有的分支指示它们能够提交,则所有分支被告知要提交。如果在预备时,有任何分支指示它们将不能提交,则所有分支被告知回滚。 3.分布式事务的语法 xid的组成 4.启动XA事务进行操作 XA END xid [ SUSPEND [ FOR MIGRATE ] ] XA PREPARE xid -- 使事务进行

MYSQL事务之Yii2.0商户提现

匿名 (未验证) 提交于 2019-12-02 22:02:20
我是一个半路出家的PHP程序员,到目前为止,不算在培训班学习的时间,已经写代码整整两年了。可能由于工作业务的原因,在这两年中我没有用到过MySQL事务。就在昨天有个关于支付宝转账的业务不得不使用MySQL事务来完成,别人说了很多,还是不明白MySQL事务到底是个啥,于是就开始了新一轮的补课,出来混,欠下的知识账总是要还的。 先简单说一下我昨天遇到的那个业务,我要在移动端发起一个支付宝提现的业务,这个业务我之前是分三步写的: 第一步: 首先提现的话,我先要在提现表里写入一条提现记录,再更新一下用户余额表,这两条数据的记录都是个预提现的记录,就是说他们的状态都是处理中; 第二步: 然后在请求支付宝的第三方接口; 第三步: 如果接口请求成功,用户已经收到支付宝付给用户的钱后,我们在更新提现记录表的状态和用户余额表的数据。 如果接口请求失败,用户没有收到支付宝转给用户的钱,则提现记录表的状态为提现失败。 但是如果用户发起了提现,用户预提现业务已经进行,但是第三方支付宝接口请求失败,此时突然断电,则数据库状态无法更改,然后结果就不是我们预想的结果了。此时MySQL事务在这种业务中就显现出了自己的价值。 MySQL事务:一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行,要么完全不执行,就是说我上面的提现业务,要么全部要执行成功,要么全部不成功,不会出现执行半截的情况

浅谈分布式事务与TX-LCN

匿名 (未验证) 提交于 2019-12-02 21:52:03
最近做项目使用到了分布式事务,下面这篇文章将给大家介绍一下对分布式事务的一些见解,并讲解分布式事务处理框架TX-LCN的执行原理,初学入门,错误之处望各位不吝指正。 使用的场景很多,先举一个常见的:在微服务系统中,如果一个业务需要使用到不同的微服务,并且不同的微服务对应不同的数据库。 打个比方:电商平台有一个客户下订单的业务逻辑,这个业务逻辑涉及到两个微服务,一个是库存服务(库存减一),另一个是订单服务(订单数加一),示意图如下: 如果在执行这个业务逻辑时没有使用分布式事务,当库存与订单其中一个出现故障时,就很可能出现这样的情况:库存数据库的值减少了1,但是订单数据库没有变化;或是库存没变化,多了一个订单,也就是出现了数据不一致现象。 所以在类似的场合下我们要使用分布式事务,保证数据的一致性。 在谈分布式事务的解决思路之前,我们先来看看单一数据源是如何做事务处理的,我们可以从中获取一些启发。 我们以mysql的InnoDB引擎为例,由于mysql中有两套日志机制,一套是存储层的redo log,另一套是server层的binlog,每次更新数据都要对两个日志进行更新。为了防止写日志时只写了其中一个而没有写另外一个,mysql使用了一个叫 两阶段提交 的方式保证事务的一致性。具体是这样的: 假设创建一个这样的数据库: mysql> create table T(ID int

什么是分布式事务以及有哪些解决方案?

匿名 (未验证) 提交于 2019-12-02 21:52:03
答:指一次大的操作由不同的小操作组成的,这些小的操作分布在不同的服务器上,分布式事务需要保证这些小操作要么全部成功,要么全部失败。从本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 总结:其实上面两种场景,归根到底是要操作多数据库,并且要保证数据的一致性,而产生的分布式事务的。 XA实现分布式事务的原理如下: 1、 同步阻塞问题 :执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。 2、 单点故障 :由于(事务管理器)协调者的重要性,一旦协调者发生故障。(本地资源管理器)参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题) 3、 数据不一致 :在二阶段提交的阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这会导致只有一部分参与者接收到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器无法执行事务提交。于是整个分布式系统便出现了数据不一致的现象。 4、 二阶段无法解决的问题

MyBatis事务管理源码阅读

匿名 (未验证) 提交于 2019-12-02 20:48:41
在实际的开发工作中,MyBatis已经成为了当下最流行的关系型数据库与实体Model的映射框架。 今天就简单学习一下MyBatis的事务处理部分源码。 Mybatis事务处理位于 org.apache.ibatis.transaction 下。类图如下: 入口类: Transaction Wraps a database connection. Handles the connection lifecycle that comprises: its creation, preparation, commit/rollback and close. 接口中定义的方法详解 Connection getConnection() 获取数据库连接 void commit() 事务提交 void rollback() 事务回滚 void close() 关闭连接 Integer getTimeout() 获取超时时间设置 再来看一下, TransactionFactory ,显然它是创建 Transaction 的工厂类。 void setProperties(Properties props); Transaction newTransaction(Connection conn); Transaction newTransaction(DataSource dataSource,