mysql事务

事务 ACID

≯℡__Kan透↙ 提交于 2020-01-14 07:39:53
事务是定义一系列操作在逻辑上可以看成一个完整的操作,具有ACID特性; Atomicity (原子性)   要求事务中所有的操作要么全部完成,要么全部没有发生,如果部分操作失败,则整个事务操作都会失败。 Consistency (一致性)   要求事务中的操作,符合容器(如:数据库)的各种规则,保证数据是合法、与规定好的方式运行,一般通过原子性来保证,数据在事务中会有各种状态,但是结果必须需要语义。   与原子性强调开始/结束状态不一样,一致性强调的是在事务过程中数据状态的不稳定,其他事务是不可见的。(隔离级别会有一些妥协) Isolation (隔离性)   事务与事务间不会相互影响,就像串行执行一样,相互之间并行时是不可见的。 Durability (持久性)   事务完成后,数据状态就保持不变,永久存储。 目前大致有两种比较流行的技术来实现事务: 预写日志(WAL)和影子分页(SP) 。 预写日志(write-ahead logging) ,主要提供ACID中的 原子性和持久性 两种特性的操作:   日志分为redo和undo信息,   undo用于记录修改前的信息,redo用于记录修改后的信息;undo可用于做事务失败的回滚操作,redo可用于做事务提交过程中故障恢复。log文件一般采用追加的方式,I/O效率高。  

JDBC管理事务

寵の児 提交于 2020-01-14 02:10:12
package com.fgy.jdbc; import java.sql.*; /** * 转账小案例 */ public class tx { public static void main(String[] args) { Connection conn = null; PreparedStatement pstm1 = null; PreparedStatement pstm2 = null; try { // 1.导入驱动jar包 // 2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 3.获取连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root"); // 开启事务 conn.setAutoCommit(false); // 4.定义SQL语句 // fan给li转账500 String sql1 = "update account set balance = balance - ? where name = ?"; String sql2 = "update account set balance = balance + ? where name = ?"; // 5.获取statement对象

Java实战之02Hibernate-06处理并发

最后都变了- 提交于 2020-01-14 00:57:25
十三、处理并发 1 、事务的隔离级别 不考虑隔离级别出现的问题: 脏读:一个线程中的事务读到了另外一个线程中未提交的数据。 不可重复读:一个线程中的事务读到了另外一个线程中提交的 update (更新)的数据。 虚读:一个线程中的事务读到了另外一个线程中提交的 insert (插入)的数据。 事务的隔离级别: 1 : READ UNCOMMITTED: 脏读、不可重复读、虚读(幻读)都可能发生。 2 : READ COMMITTED: 避免脏读;不可重复读、虚读(幻读)都可能发生。 4 : REPEATABLE READ: 避免脏读、不可重复读,虚读(幻读)可能发生。 8 : SERIALIZABLE: 避免脏读、不可重复读、虚读(幻读)。 通过配置参数 hibernate.connection.isolation=1|2|4|8 进行设置。 MySQL :默认 4 Oracle :默认 2 2 、第二类更新丢失 1 //线程1 2 @Test 3 public void test1(){ 4 Session s = HibernateUtil.getSession(); 5 Transaction tx = s.beginTransaction(); 7 Customer c1 = s.get(Customer.class, 1); 8 c1.setName("泰斯特"); 9

保证分布式系统数据一致性的6种方案

China☆狼群 提交于 2020-01-13 23:18:47
问题的起源 在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式调用时候数据的一致性? 具体业务场景如下,比如一个业务操作,如果同时调用服务 A、B、C,需要满足要么同时成功;要么同时失败。A、B、C 可能是多个不同部门开发、部署在不同服务器上的远程服务。 在分布式系统来说,如果不想牺牲一致性,CAP 理论告诉我们只能放弃可用性,这显然不能接受。为了便于讨论问题,先简单介绍下数据一致性的基础理论。 强一致 当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。根据 CAP 理论,这种实现需要牺牲可用性。 弱一致性 系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。 最终一致性 弱一致性的特定形式。系统保证在没有后续更新的前提下,系统最终返回上一次更新操作的值。在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS 是一个典型的最终一致性系统。 在工程实践上,为了保障系统的可用性,互联网系统大多将强一致性需求转换成最终一致性的需求,并通过系统执行幂等性的保证,保证数据的最终一致性。但在电商等场景中,对于数据一致性的解决方法和常见的互联网系统(如

你可能知道事务的四大特性,但是你不一定知道事务的实现原理

天涯浪子 提交于 2020-01-13 20:08:58
说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景: 面试官:"事务的四大特性是什么?" 我:"ACID,即原子性(Atomicity)、隔离性(Isolation)、持久性(Durability)、一致性(Consistency)!" 面试官:"在 MySQL 数据库的 InnoDB 引擎是怎么实现这四大特性的?" 我:"这个...这个....,还真没有了解过哎" 面试官:"那我们就先这个吧,先回去吧,我们会通知你的~" 这可能是比较常见的面试场景了,你也许回答到了事务的四大特性,但是不一定知道他的实现原理。今天我们就来一起打卡事务的四大特性和实现原理,对于原理的实现,这篇文章只是粗略的介绍一下,更多的细节可以关注我后续的文章。 数据库的事务有四大特性: 原子性、隔离性、永久性、一致性 ,下面将介绍这四大特性的定义和在 InnoDB 引擎中是怎么实现的。 原子性 定义 一次操作是不可分割的,要么全部成功,要么全部失败。比如我们的转账操作,不允许出款方成功,收款方失败这种情况,要么都成功,要么多失败,不可能出现中间状态。 实现 InnoDB 引擎使用 undo log(归滚日志)来保证原子性操作 ,你对数据库的每一条数据的改动(INSERT、DELETE、UPDATE)都会被记录到 undo log 中,比如以下这些操作: 你插入一条记录时

mysql 意向锁的作用

余生颓废 提交于 2020-01-13 11:53:25
直接copy知乎上的内容 https://www.zhihu.com/question/51513268 作者:尹发条地精 链接:https://www.zhihu.com/question/51513268/answer/127777478 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ①在mysql中有表锁, LOCK TABLE my_tabl_name READ; 用读锁锁表,会阻塞其他事务修改表数据。 LOCK TABLE my_table_name WRITe; 用写锁锁表,会阻塞其他事务读和写。 ②Innodb引擎又支持行锁,行锁分为 共享锁,一个事务对一行的共享只读锁。 排它锁,一个事务对一行的排他读写锁。 ③这两中类型的锁共存的问题 考虑这个例子: 事务A锁住了表中的 一行 ,让这一行只能读,不能写。 之后,事务B申请 整个表 的写锁。 如果事务B申请成功,那么理论上它就能修改表中的任意一行,这与A持有的行锁是冲突的。 数据库需要避免这种冲突,就是说要让B的申请被阻塞,直到A释放了行锁。 数据库要怎么判断这个冲突呢? step1:判断表是否已被其他事务用表锁锁表 step2:判断表中的每一行是否已被行锁锁住。 注意step2,这样的判断方法效率实在不高,因为需要遍历整个表。 于是就有了意向锁。 在意向锁存在的情况下

《2019年小米春季上海 PHP 实习生招聘面试题》部分答案解析

∥☆過路亽.° 提交于 2020-01-12 14:52:33
1 丶 Nginx 怎么实现负载均衡 这个还是比较简单 1.轮询 这种是默认的策略,把每个请求按顺序逐一分配到不同的 server,如果 server 挂掉,能自动剔除。 2.最少连接 把请求分配到连接数最少的 server 3.权重 使用 weight 来指定 server 访问比率,weight 默认是 1。以下配置会是 server2 访问的比例是 server1 的两倍。 4.ip_hash 每个请求会按照访问 ip 的 hash 值分配,这样同一客户端连续的 Web 请求都会被分发到同一 server 进行处理,可以解决 session 的问题。如果 server 挂掉,能自动剔除。 ip_hash 可以和 weight 结合使用。 2 丶 Linux 常用的命令 这个就不多说了 3 丶微信小程序常用的组件 view 丶 text 丶 button 丶 navigator 丶 scroll-view...... 等等 4 丶 Nginx 怎么配置虚拟主机 恩 2333333 5 丶 TP5 和 Laravel 框架差异 恩 2333333 6 丶 TP5 和 Laravel 框架中的数据迁移 这个本社区就有文档的 7 丶 RBAC 模型的讲解 什么是 RBAC RBAC (基于角色的访问控制):英文名称 Rose base Access Controller

mysql中的锁

你说的曾经没有我的故事 提交于 2020-01-12 08:53:00
mysql中的锁 本文所讨论的是mysql8.0中的锁。 一、行锁-锁模式 共享锁S和排他锁X InnoDB实现了两种行级锁,共享锁和排他锁。 共享锁:允许其他事务读取被锁住的行,但是不允许其他事务对被锁住的行进行写入操作。同时其他事务可以继续给该行加共享锁。 用法:select …for share 排他锁:防止其他事务读取或写入被该锁锁住的行,其他事务必须等待加锁事务的解锁之后才能操作,只有获取排他锁的事务可以读取数据或者写入数据。 用法:select …for update 二、表锁-意向锁 InnoDB支持多粒度的锁,为了实现多粒度锁,innodb采用了意向锁。意向锁是表级锁,表示稍后将对表中的某行加上共享锁或者排他锁。意向锁的主要目的就是表明某人正在某行加锁,或者将要在某行加锁。 IS:意向共享锁,指事务将在表中的单个行上加共享锁。 IX:意向排他锁,指事务将在表中的单个行上加排他锁。 例如, SELECT … FOR SHARE 语句设置一个IS,SELECT … FOR UPDATE 设置一个IX。 意向锁协议如下: 1、事务在获取表中某行上面的共享锁之前,必须获得IS锁,或者IX锁。 2、事务在获取表中某行上面的排他锁之前,必须获得IX锁。 各锁之间的关系如下: 意向排他锁会阻止其他事务对表加上X锁或S锁。意向共享锁会阻止其他的事务加上X锁。 三、锁类型 记录锁

MySQL基础

爱⌒轻易说出口 提交于 2020-01-12 02:57:28
1.MySQL的逻辑架构 2.并发控制 并发控制存在于MySQL的两个层面中:服务器层以及存储引擎层。 2.1 读写锁 共享锁(读锁)是共享的,或者说是相互不堵塞的。多个客户在同一时刻可以同时读取同一个资源而互不干扰。排他锁(写锁)是互斥的,也就是说一个写锁会阻塞其他的写锁和读锁。 2.2 锁粒度 一种提高共享资源并发性的方式是让锁定对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有的资源。任何时候,在给定的资源上,锁定的数据越少,则系统的并发程度就越高。 常见的锁粒度包括 表锁 以及 行锁 。表锁会锁定整张表,行锁同理。行级锁只会在存储引擎层实现,而MySQL服务器层则没有实现。 当然,每一种MySQL存储引擎都可以实现自己的锁策略和锁粒度。将锁粒度固定在某个级别,可以为某些特定的应用场景提供更好的性能,但却会失去对另外一些应用场景的良好支持。好在MySQL支持多个存储引擎的架构,所以不需要单一的通用解决方案。 3.事务 事务就是一组原子性的SQL查询,或者说是一个独立的工作单元。 事务内的语句,要么全部执行,要么全部执行失败。 可以用 start transaction 语句开始一个事务,然后要么使用 commit 提交事务将修改的数据持久保留,要么使用 rollback 撤销所有的修改。 系统需要严格的ACID测试保证事务的概念性(原子性、一致性、隔离性以及持久性)

Spring 事务失效

回眸只為那壹抹淺笑 提交于 2020-01-12 01:46:17
   隔离级别   在 TransactionDefinition.java 接口中,定义了“ 四种 ”的隔离级别枚举: /** * 【Spring 独有】使用后端数据库默认的隔离级别 * * MySQL 默认采用的 REPEATABLE_READ隔离级别 * Oracle 默认采用的 READ_COMMITTED隔离级别 */ int ISOLATION_DEFAULT = -1; /** * 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读 */ int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED; /** * 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生 */ int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED; /** * 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。 */ int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ; /** * 最高的隔离级别