数据库事务

MySQL事务之可重复读

不问归期 提交于 2020-02-19 11:37:14
在事务的并发操作中,也就是多个事务同时对同一组数据进行操作时,可能会出现脏读、不可重复读、幻读、丢失更新这四个问题,本篇博客就来为大家讲解 不可重复读 问题。 一、不可重复读概述 不可重复读 就是一个事务读到另一个事务修改后并提交的数据(update)。在同一个事务中,对于同一组数据读取到的结果不一致。比如,事务B 在 事务A 提交前读到的结果,和在 事务A 提交后读到的结果可能不同。不可重复读出现的原因就是由于事务并发修改记录而导致的。   隔离级别 有四种,分别是:读未提交、读已提交、可重复读、序列化。   读未提交: Read Uncommitted,顾名思义,就是一个事务可以读取另一个未提交事务的数据。最低级别,它存在4个常见问题(脏读、不可重复读、幻读、丢失更新)。   读已提交: Read Committed,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。 它解决了脏读问题,存在3个常见问题(不可重复读、幻读、丢失更新)。   可重复读: Repeatable Read,就是在开始读取数据(事务开启)时,不再允许修改操作 。它解决了脏读和不可重复读,还存在2个常见问题(幻读、丢失更新)。   序列化: Serializable,序列化,或串行化。就是将每个事务按一定的顺序去执行,它将隔离问题全部解决,但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

MySQL如何找出未提交事务信息

爷,独闯天下 提交于 2020-02-19 08:44:59
前阵子,我写了一篇博客 “ ORACLE中能否找到未提交事务的SQL语句 ” , 那么在MySQL数据库中,我们能否找出未提交事务执行的SQL语句或未提交事务的相关信息呢? 实验验证了一下,如果一个会话(连接)里面有一个未提交事务,然后不做任何操作,那么这个线程处于Sleep状态 mysql> select connection_id() from dual; +-----------------+ | connection_id() | +-----------------+ | 6 | +-----------------+ 1 row in set (0.00 sec) mysql> set session autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> delete from kkk where id =1; Query OK, 1 row affected (0.00 sec) mysql> 在另外一个会话(连接)里面,查询这个超过10秒未提交事务的详细信息: SELECT t.trx_mysql_thread_id ,t.trx_state ,t.trx_tables_in_use ,t.trx_tables_locked ,t.trx_query ,t.trx_rows_locked ,t.trx

JDBC总结——事务

本秂侑毒 提交于 2020-02-19 05:24:16
文章目录 事务 一、事务的基本介绍 1、概念 2、操作 3、操作实例 4、MySQL数据库中默认自动提交 二、事务的四大特征 三、事务的隔离级别 1、概念 2、存在的问题 3、隔离级别 四、Jdbc事务控制 1、概述 2、控制事务的API: 3、核心代码 事务 一、事务的基本介绍 1、概念 如果包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。 2、操作 ① 开启事务: start transaction; ② 回滚: rollback; ③ 提交: commit; 3、操作实例 account.sql -- 创建account表 CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT ; NAME VARCHAR ( 10 ) , balance DOUBLE ) ; -- 添加数据 INSERT INTO account ( NAME , balance ) VALUES ( 'zhangsan' , 1000 ) , ( 'lisi' , 1000 ) ; SELECT * FROM account ; UPDATE account SET balance = 1000 ; --张三给李四转账500元 --0.开启事务 START TRANSACTION ; --1.张三账户-500

数据库事务四大特性、隔离级别

拈花ヽ惹草 提交于 2020-02-18 18:05:53
【以转账为例】 事务 事务是指满足ACID的一组操作,可以通过Commit提交一个事务,也可以使用Rollback进行回滚。 ACID 1.原子性(Atomicity) 事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。 2.一致性(Consisitency) 数据库在事务执行前后都保持一致性状态。即转账前后,两个人账户总金额不变。 3.隔离性(Isolation) 根据隔离级别,一个事物所作的修改对于其他事务来说是不确定的。 4.持久性(Durability) 一旦事务提交,则其所作的修改将会永远保存到数据库中。 隔离级别 mysql默认的隔离级别是可重复读。 下面的代码所运行的两个事务需要在两个不同的session中执行,开启两个客户端。 1.读未提交 READ UNCOMMITTED 读未提交:事务中的修改,即使没有提交,对其他事务也是可见的。 事务1: 1 set session transaction isolation level read uncommitted; 2 3 start transaction; 4 update user set money = money - 100 where id = 1; 5 update user set money = money + 100 where id = 2; 6 commit;

常用分布式事务解决方案

半腔热情 提交于 2020-02-18 14:37:02
出处: https://github.com/clsaa/Distributed-Transaction-Notes 。 作者总结得很全面,做个笔记搬运。 一、 两阶段提交(2PC) 一个基于两阶段提交协议的分布式事务框架(LCN) 二阶段提交(Two-phaseCommit)是指,在计算机网络以及数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法(Algorithm)。通常,二阶段提交也被称为是一种协议(Protocol))。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。 所谓的两个阶段是指:第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)。 1. 准备阶段 事务协调者(事务管理器)给每个参与者(资源管理器)发送Prepare消息,每个参与者要么直接返回失败(如权限验证失败),要么在本地执行事务,写本地的redo和undo日志

分布式事务(理论+实战)

你离开我真会死。 提交于 2020-02-18 13:42:37
分布系统中,如何保证数据的一致性、原子性,分布式事务。分布式事务分为两大类,柔性事务、刚性事务。 一、方法论篇 分布式事务主要分为两部分,刚性事务和柔性事务。刚性事务主要针对DB层面,严格保证事务的原子性要么都成功,要么执行失败,全部回滚。 柔性事务,相对于刚性事务来的,为了保证DB的利用率,以及系统的吞吐量,不会长时间锁定DB资源,在事务执行失败之后不会进行回滚,而是采用补偿的方式保证数据的最终一致性,所以柔性事务又叫补偿型事务。先来介绍刚性事务。 1.1刚性事务 X/Open XA 协议, 最早的分布式事务模型是 X/Open 国际联盟提出的 X/Open Distributed Transaction Processing(DTP)模型,也就是大家常说的 X/Open XA 协议,简称XA 协议。 名词解释: 其中应用程序(Application Program ,简称AP):AP定义事务边界(定义事务开始和结束)并访问事务边界内的资源。 资源管理器(Resource Manager,简称RM):Rm管理计算机共享的资源,许多软件都可以去访问这些资源,资源包含比如数据库、文件系统、打印机服务器等。 事务管理器(Transaction Manager ,简称TM):负责管理全局事务,分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚、失败恢复等。 操作过程 第一阶段

JAVA事务系列三:JTA事务

徘徊边缘 提交于 2020-02-17 19:39:20
什么是JTA? JTA全称Java Transaction API ,即Java事务API,英文解释: Java Transaction API (JTA) specifies standard Java interfaces between a transaction manager and the parties involved in a distributed transaction system: the resource manager, the application server, and the transactional applications. JTA是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。 JTA允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据,这些数据可以分布在多个数据库上。JDBC驱动程序的JTA支持极大地增强了数据访问能力。 JTA的主要接口: 位于javax.transaction包中 a、UserTransaction接口:让应用程序得以控制事务的开始、挂起、提交、回滚等。由Java客户端程序或EJB调用。 b、TransactionManager 接口:用于应用服务器管理事务状态 c、Transaction接口:用于执行相关事务操作 d、XAResource接口

事务的由来以及aid保证一致性(状态总是正确的)

我怕爱的太早我们不能终老 提交于 2020-02-17 15:03:54
首先,我们需要搞清楚为什么会出现事务. Transactions are not a law of nature; they were created with a purpose, namely to simplify the programming model for applications accessing a database. By using transactions, the application is free to ignore certain potential error scenarios and concurrency issues, because the database takes care of them instead (we call these safety guarantees). 这句话的大体含义就是,事务的产生,其实是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要我们去考虑各种各样的潜在错误和并发问题.可以想一下当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧? 题外话: 因此事务本质上是为了应用层服务的.而不是伴随着数据库系统天生就有的.其次,说道一致性,很遗憾,这个词在不同的环境下有着不同的含义,被极大的滥用了,导致很难理解:1. 多副本的一致性2.

Mysql存储过程、触发器和事务

会有一股神秘感。 提交于 2020-02-17 14:31:47
一、存储过程 定义存储过程 语法: create procedure 过程名(参数1,参数2....) begin sql语句; end 创建存储过程之前我们必须修改mysql语句默认结束符; 要不能我们不能创建成功 , 使用 delimiter 可以修改执行符号。 mysql> delimiter % #这样结束符就为% mysql> create procedure selCg() -> begin -> select * from category; -> end % 调用存储过程 语法: call 过程名(参数1,参数2); mysql> call selCg() ; 存储过程参数类型 In 参数 特点:读取外部变量值,且有效范围仅限存储过程内部 例 1 : mysql> delimiter // mysql> create procedure pin(in p_in int) -> begin -> select p_in; -> set p_in=2; -> select p_in; -> end // mysql> delimiter ; #使用完马上恢复默认的 mysql> call pin(1); #调用pin存储过程 例 2 :定义存储过程 getOneBook,当输入某书籍 id 后,可以调出对应书籍记录 mysql> create procedure

05. redis事务

谁说我不能喝 提交于 2020-02-17 08:03:25
目录 Redis 事务 事务 1. 命令有序 2. 始终原子 开启使用事务 Redis事务中出现错误 1. EXEC前的错误 2. EXEC后的错误 为什么出错了不支持roll backs? Redis的乐观锁实现check-and-set 小结 Redis 事务 Redis操作时支持事务的。事务具有原子性atomic,包含在事务中的操作要么都执行成功,要么都执行失败。但是redis不支持回滚,但是可以在测试开发环节避免错误操作。可以说原子性上是半支持的,看后面原因。 很多时候我们需要进行事务操作。 翻译官档: https://redis.io/topics/transactions 实际操作:python版使用参考 https://github.com/7Edge/redis-demo/blob/master/redis_pipeline.py 事务 MULTI, EXEC, DISCARD 和 WATCH 操作都是redis事务的基础操作。这些操作可以让一组操作看作一个操作原子执行。之所以能做到,是因为一下两个重要的保障: 1. 命令有序 在事务中的所有命令都是有序的,且执行是顺序执行的。当另一个客户端连接发生错误,是不可能影响到当前正在执行的事务的。这点就保证了命令执行时是相互隔离的操作。因为是单线程,且redisserver利用i/o多路复用来处理并发连接。 2. 始终原子