数据库事务

大厂面试必知必会:图解分布式事务实现原理

让人想犯罪 __ 提交于 2019-12-19 17:12:33
问题场景 什么是事务? 事务是数据库从一个稳定状态变迁到另一个稳定状态的保证,具备 ACID 这 4 个特性: 原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态。 一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性限制没有被破坏。 隔离性(Isolation):两个事务的执行是互不干扰的,两个事务时间不会互相影响。 持久性(Durability):在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的。 例如应用程序需要更新多条相关数据时就需要进行事务处理。 什么是分布式事务? 当遇到复杂业务调用时,可能会出现跨库多资源调用(一个事务管理器,多个资源)/多服务调用(多个事务管理器,多个资源),期望全部成功或失败回滚,这就是分布式事务,用以保证“操作多个隔离资源的数据一致性”。 分布式事务与 XA 规范 分布式事务是指会涉及到操作多个数据库的事务,同样必须保证 ACID。其就是将对同一库事务的概念扩大到了对多个库的事务:对同一库的 SQL 操作对应了分布式事务中对一个库的事务。 X/Open XA 定义了分布式事务处理的规范,并由数据库厂商在驱动层面进行实现。XA 规范的基础是两阶段提交协议

MySQL死锁

旧巷老猫 提交于 2019-12-19 13:08:06
https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks.html 什么是mysql的死锁? A deadlock is a situation where different transactions are unable to proceed because each holds a lock that the other needs. Because both transactions are waiting for a resource to become available, neither ever release the locks it holds. 简单来说可以提炼出2个词:环路等待( each holds a lock that the other needs )和不可剥夺( neither ever release the locks it holds )。 其实广泛意义上死锁的四个必要条件也可以直接简化为上述两个条件,剩下的互斥和请求保持条件只是两个众所周知的补充。 一、一个简单的死锁示例: 会话A: mysql> CREATE TABLE t (i INT) ENGINE = InnoDB; Query OK, 0 rows affected (1.07 sec) mysql> INSERT INTO

压箱底的干货!干货!——Redis面试系列(一)

浪尽此生 提交于 2019-12-19 07:59:54
一、什么是 Redis? Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库,可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。另外,Redis 也经常用来做分布式锁。除此之外,Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。 Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 二、Redis 与其他 key - value 缓存产品有以下三个特点: (1)Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 (2)Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。 (3)Redis 支持数据的备份,即 master-slave 模式的数据备份。 三、Redis有哪些优缺点 优点 (1)性能极高 – Redis 能读的速度是

Java-JDBC调用批处理、存储过程、事务

房东的猫 提交于 2019-12-19 05:38:06
一、使用Batch批量处理数据库 当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。; 1、实现批处理有两种方式,第一种方式: Statement.addBatch(sql) list 执行批处理SQL语句 executeBatch()方法:执行批处理命令 clearBatch()方法:清除批处理命令 例: Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JDBCManager.getConnection(); String sql1 = "insert into user(name,password,email,birthday) values('kkk','123','abc@sina.com','1978-08-08')"; String sql2 = "update user set password='123456' where id=3"; st = conn.createStatement(); st.addBatch(sql1); //把SQL语句加入到批命令中 st.addBatch(sql2); //把SQL语句加入到批命令中 st.executeBatch(); } finally{

Android--数据持久化之SQLite

ε祈祈猫儿з 提交于 2019-12-19 04:56:40
前言   对于一个应用程序而言,数据持久化是必不可少的,Android程序也不例外。这篇博客将介绍Android中关于SQLite的使用,SQLite是一种嵌入式的数据库引擎,专门适用于资源有限的设备上进行适量的数据存储,而Android就全面支持标准的SQLite数据库。在本片博客中,将说明SQLite数据库的创建以及维护,还有使用SQLite执行CRUD的两种方式,以及SQLite中事务的使用,最后都会使用示例讲解博客中所提到的概念性的内容。 SQLite   Android对SQLite数据库,提供了完全的支持,而所有创建的SQLite数据库,仅限于当前应用访问,如果其他应用需要访问,则必须提供的Content Provider的支持,并且SQLite数据库会随着Android应用的卸载而被删除。SQLite是一个嵌入式的数据库引擎,最后是以文件的形式保存数据的。从本质上来看,SQLite的操作方式只是一种更为便捷的文件操作,当应用程序创建或打开一个SQLite数据库时,其实只是打开一个文件准备读写。因为SQLite仅适用于资源有限的小型设备,所以本身就不应该把大量数据存储在设备的SQLite数据库里,SQLite只适合存储一些小型的数据。   为了使SQLite和其他数据库间的兼容性最大化,SQLite支持对列上类型进行“类型近似”

Spring事务管理

岁酱吖の 提交于 2019-12-19 04:07:55
Spring事务管理分为 声明式事务管理 和 编程式事务 管理,声明式事务管理又分为 xml 和 注解 两种配置方式。应该优先选择声明式事务,因为声明式事务对程序代码的影响最小,因此最符合 非侵入式轻量级容器 的理想 。只有在进行少量事务操作时,才应该选择编程式事务管理的方式。 声明式事务管理 xml配置方式 Spring配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans

事务

我与影子孤独终老i 提交于 2019-12-19 03:10:21
事务与并发写 某个正在更新的记录在提交或回滚前不能被其他事物同时更新 先加锁后修改 等待锁释放 事物的ACID 原子性Atomic : 要么全部执行,要么全部不执行,中途数据库发生异常,未提交的事物都被回滚 一致性Consistency : 数据库从一种正确状态转为另一种正确状态,数据库在修改时保证数据的正确性合理性一致性 隔离性Isolation 事务正确提交完成前,中间的任何数据变化对其他的事物都是不可见的 持久性Durability : 事物一旦提交就永久保存…数据库写在事务日志异步更新到磁盘,使用事务日志持久化实现只要是性能方面的考虑 四种隔离级别 1读未提交:读到未提交的数据 2读已提交:两次读取到的数据不一致(不可重复读) 3可重复读 mysql默认隔离级别 4串行化:读写数据会锁表.并发性能低 并发事务问题 脏读,读取他人未提交事物 不可重复读:其他事务对数据进行了修改 幻读:其他事务对数据进行了增加或删除 查看数据库默认的隔离级别 select @ @tx_isolation ; 默认级别可重复读 REPEATABLE - READ 设置隔离级别为–读未提交 set tx_isolation = 'read-uncommitted' ; select @ @tx_isolation ; READ - UNCOMMITTED 读已提交 --解决脏读 set tx

sqlserver中创建包含事务的存储过程

心不动则不痛 提交于 2019-12-19 01:58:36
什么是事务 事务时包含1条或多条语句的逻辑单元。事务中的语句是一个整体,要么一起提交,要么一起撤销。事务在提交前可以回滚,一旦提交就不能撤销修改了,是永久性的修改。 为什么使用事务 可以例举生活中的例子,比如银行转账:A向B转100万。程序的执行顺序:1.A账户减掉100万 2.B账户增加100万。若是都成功执行倒没什么,假设1成功执行,2执行失败,就会出问题。运用事务就不会出现这种问题,因为只要其中有一步操作失败,事务就会回滚,之前的所有操作将会被撤销。 事务的基本控制语句 1.BEGIN TRANSACTION:事务开始 2.COMMIT TRANSACTION:事务提交 3.ROLLBACK TRANSACTION:事务回滚 事务的特性(ACID) 1.ATOMIC(原子性):事务中程序是数据库的逻辑工作单元,对数据的修改要么全执行,要么全不执行。 2.CONSISTENT(一致性):事务执行前后数据一致,事务完成之后数据的修改才可见。 3.ISOLATED(隔离性):并发事务之间不能相互干扰 4.DURABLE(持久性):事务一旦提交就是对数据的永久修改。 下面是一个包含事务的存储过程的例子: 1 ALTER proc [dbo].[Proc_InsertStudent] 2 @stuName nvarchar(50),@stuClassId int,@stuAge int

informix 数据库锁表分析和解决方法

人盡茶涼 提交于 2019-12-19 01:57:00
在联机事务处理(OLTP)的数据库应用系统中,多用户、多任务的并发性是系统最重要的技术指标之一。为了提高并发性,目前大部分RDBMS都采用加锁技术。然而由于现实环境的复杂性,使用加锁技术又不可避免地产生了死锁问题。因此如何合理有效地使用加锁技术,最小化死锁是开发联机事务处理系统的关键。 死锁产生的原因 在联机事务处理系统中,造成死机主要有两方面原因。一方面,由于多用户、多任务的并发性和事务的完整性要求,当多个事务处理对多个资源同时访问时,若双方已锁定一部分资源但也都需要对方已锁定的资源时,无法在有限的时间内完全获得所需的资源,就会处于无限的等待状态,从而造成其对资源需求的死锁。 另一方面,数据库本身加锁机制的实现方法不同,各数据库系统也会产生其特殊的死锁情况。如在Sybase SQL Server 11中,最小锁为2K一页的加锁方法,而非行级锁。如果某张表的记录数少且记录的长度较短(即记录密度高,如应用系统中的系统配置表或系统参数表就属于此类表),被访问的频率高,就容易在该页上产生死锁。 容易发生死锁的几种情况如下: 1>不同的存储过程、触发器、动态SQL语句段按照不同的顺序同时访问多张表; 2>在交换期间添加记录频繁的表,但在该表上使用了非群集索引(non-clustered); 3>表中的记录少,且单条记录较短,被访问的频率较高; 4>整张表被访问的频率高(如代码对照表的查询等

SQL Transcation的一些总结

本秂侑毒 提交于 2019-12-19 01:20:26
1.1.1 摘要 相信大家对于SQL Transcation再熟悉不过,它确保了数据库的数据一致性和安全性,尤其在对数据执行增删时,如果发生异常和错误它就会触发事务回滚,从而确保了我们数据的一致性和安全性,下面我们将通过分四部分介绍事件(Transcation)。 1.1.2 正文 首先让我们通过一个具体的例子介绍Transcation的使用,假如我们的数据库中有一个表UserInfo,它包含三个字段分别为:UserID(自增)、UserName (nvarchar)和LuckyNumber (tinyint),如下图所示: 图1 UserInfo表 UserInfo表的sql代码如下: -- The definition of UserInfo. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[UserInfo]( [UserID] [int] IDENTITY(1,1) NOT NULL, [UserName] [nvarchar](50) NOT NULL, [LuckyNumber] [tinyint] NOT NULL ) ON [PRIMARY] 接着我们要把数据插入到表UserInfo中,这里使用一个存储过程把数据插入到该表中