事务

java事务理解

六月ゝ 毕业季﹏ 提交于 2020-02-07 15:43:10
还在学Hibernate,后续一大堆概念刚接触需要理解。觉得-——事务——这个概念不是很好理解,所以发上来记录一下。 首先说点千篇一律的东西。概念和特性都是随处可见的,无论哪里都很容易找到,关键是你如何去理解它。 概念:事务(Transaction)是访问并可能更新数据库中各种 数据项 的一个程序执行单元(unit)。事务通常由 高级数据库 操纵语言或编程语言(如SQL,C++或Java)书写的 用户程序 的执行所引起,并用形如begin transaction和end transaction语句(或 函数调用 )来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。 例如:在 关系数据库 中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。 特性: 事务是恢复和 并发控制 的基本单位。 事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性(isolation)。一个事务的执行不能被其他事务干扰

pymysql操作数据库

筅森魡賤 提交于 2020-02-07 12:12:30
数据库连接 import pymysql #打开数据库连接 db = pymysql.connect('localhost','user','password','dbname') #使用cursor()方法创建一个游标对象 cursor cursor = db.cursor() #使用execute()方法执行SQL语句 cursor.execute('select version()') 使用fetchone()方法获取单条数据 data = cursor.fetchone() print('Database version : %s'%data) #关闭数据库 db.close() 创建数据库表 #如果数据库连接存在我们可以使用execute()方法来为数据库创建表,如下所示创建表EMPLOYEE: import mysql db=pymysql.connect('localhost','username','password','dbname') cursor = db.cursor() sql = """ create table employee( first_name char(20), list_name char(20), age int, sex char(1), income float )""" cursor.execute(sql) db.close()

分布式事务解决方案之TCC

若如初见. 提交于 2020-02-07 08:57:13
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分为三个阶段 : Try阶段是做业务检查(一致性)及资源预留(隔离),此阶段仅是一个初步操作,它和后续的Confirm一起才能真正构成一个完整的业务逻辑。 Confirm阶段是做确认提交,Try阶段所有分支事务执行成功后开始执行Confirm。通常情况下,采用TCC则认为Confirm阶段是不会出错的。即 :只要Try成功,Confirm一定成功。若Confirm阶段真的出错了,需引入重试机制或人工处理。 Cancel阶段是在业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放。通常情况下,采用TCC则认为Cancel阶段也是一定成功的。若Cancel阶段真的出错了

Spring之路(40)–使用@Transactional进行声明式事务管理如此简单

别说谁变了你拦得住时间么 提交于 2020-02-07 04:13:55
足够简单 说实话要实现事务管理,给一个方法添加一个注解,则该方法自动实现事务,足够简单了,我也没法想还有更简单的么。 这个注解就是@Transactional,就是这么优秀。所谓的声明式事务管理,就是通过在方法(或类)上添加注解声明来启用事务的方式。 声明式事务实例 第一,正常的编写数据对象Do与数据库表blog对应: package org . maoge . transactionaldemo ; /** * @theme 数据对象--博客 * @author maoge * @date 2020-01-27 */ public class BlogDo { private Long id ; private String title ; private String author ; private String content ; // 省略get get } 第二,编写数据库操作类,通过NamedParameterJdbcTemplate 操作数据库。 package org . maoge . transactionaldemo ; import java . util . HashMap ; import java . util . Map ; import org . springframework . jdbc . core . namedparam .

什么是分布式微服务架构?三分钟彻底弄懂什么是分布式和微服务

笑着哭i 提交于 2020-02-07 01:23:01
本文转载自: 什么是分布式微服务架构?三分钟彻底弄懂什么是分布式和微服务 一、微服务简介 1. 微服务的诞生 微服务是基于分而治之的思想演化出来的。过去传统的一个大型而又全面的系统,随着互联网的发展已经很难满足市场对技术的需求,于是我们从单独架构发展到分布式架构,又从分布式架构发展到 SOA 架构,服务不断的被拆分和分解,粒度也越来越小,直到微服务架构的诞生。 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务运行在其独立的进程中,服务和服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。 2. 微服务架构与SOA架构的区别 微服务是真正的分布式的、去中心化的。把所有的“思考”逻辑包括路由、消息解析等放在服务内部,去掉一个大一统的 ESB,服务间轻通信,是比 SOA 更彻底的拆分。 微服务架构强调的重点是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用,这些小应用之间通过服务完成交互和集成。 3. 微服务架构引发的问题

2020-02-06

佐手、 提交于 2020-02-06 16:10:14
Spring事务失效的 8 大原因,这次可以吊打面试官了! 今天再来一篇《吊打面试官》系列,这次真的要吊打了,哈哈!(看往期吊打系列请在后台回复:吊打,我会陆续更新……) 前几天栈长不是发了一篇文章,里面有一个关于事务失效的问题: 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 其中有个热心粉丝留言分享了下,我觉得总结得有点经验,给置顶了: 但是我觉得还是总结得不够全,今天栈长我再总结一下,再延着这位粉丝的总结再补充完善一下,不用说,我肯定也不见得总结全,但希望可以帮忙有需要的人。 1 数据库引擎不支持事务 这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。 根据 MySQL 的官方文档: https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html 从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是白搭。 2 没有被 Spring 管理 如下面例子所示: // @Service public class OrderServiceImpl implements OrderService {

【MySQL】事务 与 锁

点点圈 提交于 2020-02-06 10:36:15
事务的 4个 特性(ACID) 原子性(Atomicity):事务是不可分割的工作单元,其包含的操作,要么都做,要么都不做。 一致性(Consistency):事务执行后,数据记录必须符合各项约束条件。 隔离性(Isolation):并发事务的执行不能相互干扰。 持久性(Durability):事务成功提交意味着相关改动已被持久化保存。即使数据库服务中断,也不会丢失以提交事务的改动。 事务的 4个 隔离级别 事务的隔离级别用于控制事务的并发执行。 MySQL InnoDB 提供了 SQL-1992 中定义的4个隔离级别。 可为事务设置隔离级别,以优化事务并发的性能。 可为单个session设置(set transaction),也设置MySQL的默认隔离级别。 Repeatable Read:可重复读 这是MySQL默认的隔离级别,也是最常用的级别。 在单次事务内,多次执行相同的(非锁)查询操作,所得结果相同。(除非事务内部自己改了数据) 在第一次查询结果返回后,这些结果数据会被做成快照,后续相同的查询将从快照获取结果( MVCC ,Multiversion Concurrency Control)。 这种不加锁的模式存在 幻读 问题。 Update、Delete、有锁读(Select For Update/Share)操作需要加锁。可防止 幻读。 使用了 唯一索引 查询条件

Spring Boot2.0之 整合Redis事务

99封情书 提交于 2020-02-06 07:41:47
Redis事物 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。 一个事务从开始到执行会经历以下三个阶段: 开始事务。 命令入队。 执行事务。 事务的开启很简单的: 可以使用AOP封装下~ 跟之前使用MySQL数据库没啥子区别的 看下目录 pom: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>redis</groupId> <artifactId>com.toov5.redis</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org

分布式事务(柔性事务)

ぃ、小莉子 提交于 2020-02-06 07:22:50
由于系统应用业务涉及到分布式事务问题,所以采用了柔性分布式事务,最终保证业务数据的一致性。 设计思路图: demo代码地址: https://gitee.com/wywh/wywhdgg-mq 来源: CSDN 作者: 无怨_无悔 链接: https://blog.csdn.net/sdmxdzb/article/details/104186381

一文让你搞懂Spring的统一事务模型

拟墨画扇 提交于 2020-02-06 05:58:00
Spring事务的知识体系 进入主题之前,先来了解一下Spring事务,都有哪些内容: Spring事务包含对 分布式事务 和 单机事务 的支持,我们用的比较多的是单机事务,也就是只操作一个数据库的事务。 单机事务,按照用法分,又可以分为 编程式事务模型 (TransactionTemplate)和 声明式事务模型 (@Transactional注解),后者可以理解为 aop + 编程式事务模型。 编程式事务模型里面涉及到很多知识点,比如统一事务模型、事务传播级别、事务隔离级别等。 我们今天要讲的是其中一点, 统一事务模型 。 希望这次的分享能够让大家,对Spring事务有一个整体性的认识。 不仅仅是Template Spring的统一事务模型,解决的一个核心问题,就是不管你用的是什么数据访问方式,Hibernate、MyBatis抑或是JDBC, 你的Service层的代码都是一样的,不需要做任何变动。 使用@Transactional注解的,相信大家都用过,而且由于注解的实现比较隐晦,不利于我们理解原理,这里就不演示。 下面介绍编程式事务模型, TransactionTemplate : 不管后面你的Dao实现如何变化,上面这一段Service代码都无需修改,而且依旧可以保持事务的逻辑。 Spring是怎么做到的呢? 有人说,是 模板模式 。