事务管理

spring下春注解的声明式事务控制

跟風遠走 提交于 2019-12-05 15:20:10
package com.hope.test;import com.hope.domain.Account;import com.hope.service.IAccountService;import config.SpringConfiguration;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.ComponentScans;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context

分布式事务之解决方案(XA和2PC)

拟墨画扇 提交于 2019-12-05 12:12:56
3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案有2PC、TCC、可靠消息最终一致性、最大努力通知这几种。 3.1. 什么是2PC 2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase),2是指两阶段,P是指准备阶段,C是提交阶段。 举例 :张三和李四好久不见,老友约起聚餐,饭店老板要求先买单,才能出票。这时张三和李四分别抱怨近况不如意,囊肿羞涩,都不愿意请客,这时只能AA。只有张三和李四都付款,老板才能出票安排就餐。但由于张三和李四都是铁公鸡,形成两尴尬的一幕 : 准备阶段 :老板要求张三付款,张三付款。老板要求李四付款,李四付款。 提交阶段 :老板出票,两人拿票纷纷落座就餐。 例子中形成两一个事务,若张三或李四其中一个拒绝付款,或钱不够,店老板都不会给出票,并且会把已收款退回。 整个事务过程由事务管理器和参与者组成,店老板就是事务管理器,张三、李四就是事务参与者,事务管理器负责决策整个分布式事务的提交和回滚,事务参与者负责自己本地事务的提交和回滚。 在计算机中部分关系数据库如Oracle、MySQL支持两阶段提交协议,如下图 : 1. 准备阶段(Prepare phase):事务管理器给每个参与者发送Prepare消息,每个数据库参与者在本地执行事务

数据库理论基础

倾然丶 夕夏残阳落幕 提交于 2019-12-05 11:27:01
一、什么是数据库 数据:描述事物的符号记录,可以是数字、文字、图形、图像、声音、语言等,数据有多种形式,它们都可以经过数字化后存入计算机。 数据库:存储数据的仓库,是长期存放在计算机内、有组织、可共享的大量数据的集合。数据库中的数据按照一定数据模型组织、描述和存储,具有较小的冗余度,较高的独立性和易扩展性,并为各种用户共享。 数据库特点如下: 数据结构化 数据的共享性高,冗余度低,易扩充 数据独立性高 数据由 DBMS 统一管理和控制(安全性、完整性、并发控制、故障恢复) DBMS:数据库管理系统(能够操作和管理数据库的大型软件,例如MySQL。) 二、数据库与文件系统区别 数据库系统:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件, 用于建立、使用和维护数据库,简称 DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全 性和完整性。 文件系统:文件系统是操作系统用于明确存储设备(常见的是磁盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。 2.1、对比与区别 2.1.1、管理对象不同 文件系统的管理对象是文件,并非直接对数据进行管理,不同的数据结构需要使用不同的文件类型进行保存,例如可执行文件为.exe,word文件为.doc。

JDBC_笔记

假如想象 提交于 2019-12-05 11:07:16
一、JDBC   步骤    1. 导入驱动jar包 2.注册驱动//DriverManager.registerDriver(new Driver() Class.forName("com.mysql.jdbc.Driver"); 3.获取数据库连接对象 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");     参数:      * url:指定连接的路径      * 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称      * 例子:jdbc:mysql://localhost:3306/db3      * 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称      * user:用户名      * password:密码 4.定义sql语句 String sql = "update account set balance = 500 where id = 1";        boolean execute(String sql) :可以执行任意的sql 了解       int executeUpdate

D011MySQL学习笔记-事务

五迷三道 提交于 2019-12-05 11:03:45
一、基本介绍 1、概念 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败; 2、操作 ①开启事务:start transaction; ②回滚:rollback; ③提交:commit; 案例: 3、MySql数据库中事务默认自动提交 事务自动提交: 一条DML(增删改)语句会自动提交一次事务; 事务手动提交: 手动开启事务(start transaction),需要手动提交(commit); 修改事务的默认提交方式: -- 查看默认的提交方式 select @@autocommit; -- 1代表自动提交 0代表手动提交 -- 修改默认的提交方式 set @@autocommit = 0; 二、事务的四大特征(常见面试题) 1、原子性: 是不可分割的最小操作单位,要么同时成功,要么同时失败; 2、持久性: 当事务提交或回滚后,数据库会持久化地保存数据; 3、隔离性: 多个事物之间相互独立;(实际上,多个事物之间会产生影响,需要进行手动隔离(类似Java多线程里面,需要锁机制)) 4、一致性: 事务操作前后,数据总量不变; 三、事务的隔离级别(了解) 1、概念: 多个事务之间是相互独立的,但是多个事务同时操作同一批数据则会引发一些问题,设置不同的隔离级别就可以解决这些问题; 2、存在问题 ①脏读:一个事务读取到另一个事务中没有提交的数据;

mysql事务与PDO事务处理-转载

风流意气都作罢 提交于 2019-12-05 08:49:56
1、MySQL事务   MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!     1)在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务     2)事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行     3)事务用来管理insert,update,delete语句一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)       1、事务的原子性:一组事务,要么成功;要么撤回。       2、稳定性 : 有非法数据(外键约束之类),事务撤回。       3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。       4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。 ———————————————— 在Mysql控制台使用事务来操作

分布式服务框架之服务化最佳实践

不羁岁月 提交于 2019-12-05 06:07:00
在服务化之前,业务通常都是本地API调用,本地方法调用性能损耗较小。服务化之后,服务提供者和消费者之间采用远程网络通信,增加了额外的性能损耗,业务调用的时延将增大,同时由于网络闪断等原因,分布式调用失败的风险也增大。如果服务框架没有足够的容错能力,业务失败率将会大幅提升。 除了性能、可靠性等问题,跨节点的事务一致性问题、分布式调用带来的故障定界困难、海量微服务运维成本增加等也是分布式服务框架必须要解决的难题。本章节我们将对服务化之后面临的挑战进行分析,并给出解决方案和业务最佳实践。 1. 性能和时延问题 在服务化之前,业务通常都是本地API调用,本地方法调用性能损耗较小。服务化之后,服务提供者和消费者之间采用远程网络通信,增加了额外的性能损耗: 1) 客户端需要对消息进行序列化,主要占用CPU计算资源。 2) 序列化时需要创建二进制数组,耗费JVM堆内存或者堆外内存。 3) 客户端需要将序列化之后的二进制数组发送给服务端,占用网络带宽资源。 4) 服务端读取到码流之后,需要将请求数据报反序列化成请求对象,占用CPU计算资源。 5) 服务端通过反射的方式调用服务提供者实现类,反射本身对性能影响就比较大。 6) 服务端将响应结果序列化,占用CPU计算资源。 7) 服务端将应答码流发送给客户端,占用网络带宽资源。 8) 客户端读取应答码流,反序列化成响应消息,占用CPU资源。

使用事件和消息队列实现分布式事务

孤街浪徒 提交于 2019-12-05 06:06:19
http://skaka.me/blog/2016/04/21/springcloud1/ 不同于单一架构应用(Monolith), 分布式环境下, 进行事务操作将变得困难, 因为分布式环境通常会有多个数据源, 只用本地数据库事务难以保证多个数据源数据的一致性. 这种情况下, 可以使用两阶段或者三阶段提交协议来完成分布式事务.但是使用这种方式一般来说性能较差, 因为事务管理器需要在多个数据源之间进行多次等待. 有一种方法同样可以解决分布式事务问题, 并且性能较好, 这就是我这篇文章要介绍的使用事件,本地事务以及消息队列来实现分布式事务. 我们从一个简单的实例入手. 基本所有互联网应用都会有用户注册的功能. 在这个例子中, 我们对于用户注册有两步操作: 1. 注册成功, 保存用户信息. 2. 需要给用户发放一张代金券, 目的是鼓励用户进行消费. 如果是一个单一架构应用, 实现这个功能非常简单: 在一个本地事务里, 往用户表插一条记录, 并且在代金券表里插一条记录, 提交事务就完成了. 但是如果我们的应用是用微服务实现的, 可能用户和代金券是两个独立的服务, 他们有各自的应用和数据库, 那么就没有办法简单的使用本地事务来保证操作的原子性了. 现在来看看如何使用事件机制和消息队列来实现这个需求.(我在这里使用的消息队列是kafka, 原理同样适用于ActiveMQ

查看zookeeper事务日志正确姿势

让人想犯罪 __ 提交于 2019-12-05 05:16:35
查看zookeeper事务日志正确姿势 用vi打开发现乱码,查资料发现说是文件里是二进制。zoo.cfg中可以通过dataLogDir来配置zookeeper的事务日志的输出目录。但是这些日志文件是二进制的,无法通过普通的查看名单看。需要通过org.apache.zookeeper.server.LogFormatter。姿势如下 1.在Linux中 命令如下: java -cp :/ .. ./slf4j-api-1.7.2.jar:/ .. ./zookeeper-3.4.6.jar org.apache.zookeeper.server.LogFormatter / .. .dataLogDir/version-2/log.1 或 java -classpath :./slf4j-api-1.7.2.jar:./zookeeper-3.4.6.jar org.apache.zookeeper.server.LogFormatter log.1700000001 第二个命令 在window中 java -classpath ".;*" org.apache.zookeeper.server.LogFormatter log.1700000001 这是把所需jar和文件放到当前目录下的 补充知识 以log.****文件开头的是zookeeper的事务文件,每个文件大小是64m

ZooKeeper查看事务日志

好久不见. 提交于 2019-12-05 05:14:05
zoo.cfg中可以通过dataLogDir来配置zookeeper的事务日志的输出目录。但是这些日志文件是二进制的,无法通过普通的查看名单看。需要通过org.apache.zookeeper.server.LogFormatter。 命令如下: java -cp :/usr/local/zookeeper/zookeeper/lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper/zookeeper/zookeeper-3.4.11.jar org.apache.zookeeper.server.LogFormatter /usr/local/zookeeper/zookeeper/dataLogDir/version-2/log.1 以下转自: https://www.linuxidc.com/Linux/2016-03/129509.htm ZooKeeper日志与快照文件简单分析 有用过Zookeeper的都知道zoo.cfg配置文件中有dataDir配置项用于存储数据,不过可能有些人不太清楚这个目录具体存储的是那些数据,默认情况下这个目录是用于存储Log(事务日志)与Snapshot(快照)数据,但是Zookeeper还提供了一个用于Log存储目录的配置项dataLogDir而dataDir用于存储Snapshot数据