mysql事务

SQLite学习手册(锁和并发控制)

北城以北 提交于 2019-12-06 16:06:16
一、概述: 在SQLite中,锁和并发控制机制都是由pager_module模块负责处理的,如ACID(Atomic, Consistent, Isolated, and Durable)。在含有数据修改的事务中,该模块将确保或者所有的数据修改全部提交,或者全部回滚。与此同时,该模块还提供了一些磁盘文件的内存Cache功能。 事实上,pager_module模块并不关心数据库存储的细节,如B-Tree、编码方式、索引等,它只是将其视为由统一大小(通常为1024字节)的数据块构成的单一文件,其中每个块被称为一个页(page)。在该模块中页的起始编号为1,即第一个页的索引值是1,其后的页编号以此类推。 二、文件锁: 在SQLite的当前版本中,主要提供了以下五种方式的文件锁状态。 1). UNLOCKED: 文件没有持有任何锁,即当前数据库不存在任何读或写的操作。其它的进程可以在该数据库上执行任意的读写操作。此状态为缺省状态。 2). SHARED: 在此状态下,该数据库可以被读取但是不能被写入。在同一时刻可以有任意数量的进程在同一个数据库上持有共享锁,因此读操作是并发的。换句话说,只要有一个或多个共享锁处于活动状态,就不再允许有数据库文件写入的操作存在。 3). RESERVED: 假如某个进程在将来的某一时刻打算在当前的数据库中执行写操作,然而此时只是从数据库中读取数据

野猪

不羁的心 提交于 2019-12-06 15:18:37
由于数据存储期间,可能发生错误、故障的点特别多,比如网络中断、磁盘写满等,面对这些复杂的情况,应用层应付起来非常困难。所以就有了事务的概念,说道事务,我们最先能想到的就是:可以一次事务中将很多读写入操作打包成一个逻辑操作单元,整个事务不成功(Committed)便成仁(Rollback)。如果失败,应用层可根据情况安全地重试,不用担心部分写入的问题。 总的来说,事务就是一层抽象,为简化应用层编程模型而生!当然,并非所有的数据库都支持事务,但是对关系型数据库而言,这个基本是标配;某些 NoSQL 数据库可能因为性能、可用性以及扩展性考虑,而放弃了对事务的支持。另外,分布式数据库下,事务的实现会更加困难,并且执行开销也很大,但并不代表它不能实现。典型的 分布式关系数据库如 TiDB 以及 Google Spanner 就提供了事务支持。 深入理解 ACID Atomicity(原子性) :将多个写操作纳入一个原子事务中,并在故障(进程崩溃、网络中断、磁盘故障)发生时能够及时中止事务,并将部分完成的写入全部丢弃。 Consistency(一致性) : 对数据有特定的状态预期,任何数据变更必须满足这些状态约束(或者恒等条件) 应用进程应该负责保证这种一致性,数据库只是存储 这个更多的是应用层属性 ,所以 C 原本不属于 ACID,只是作者 Joe Hellerstein

mysql数据库的主从复制

萝らか妹 提交于 2019-12-06 15:17:20
数据库的主从复制 MySQL中的复制功能用于将数据变更从一个服务器(Master)复制到一个或多个从属服务器(Slave) 主服务器将更改写入二进制日志(binlog),从服务器请求主服务器的binlog并应用其内容日志文件的格式影响从属服务器应用更改的方式 MySQL支持基于语句的(statment)、基于行的(row)以及混合格式的(mixed)日志格式 在复制过程中主服务器使用基于行(row)的日志格式可以大幅降低主服务器和从属服务器数据不一致的情况发生 从属服务器数量 一个主服务器可以具有的从属服务器数量理论上没有限制 每个额外的从库都会占用主库较少资源,所以在生产环境配置从库时应该仔细斟酌每个从库的必要性 最佳从属服务器数量取决于许多因素:模式大小、写入次数、主服务器和从属服务器的相对性能以及 CPU 和内存可用性等因素 网络故障对主从复制的影响 MySQL中的复制功能在网络故障时暂停工作,在网络故障恢复后复制工作将继续进行 每个从属服务器跟踪其已经处理了多少日志并在网络连接恢复时自动继续处理,此行为是自动的,不需要特殊配置 主库和从库的关系 Master和Slave是一对多的关系(MySQL5.5,5.6版本) 一个Master主服务器可以对应多个Slave从属服务器,一个Slave从属服务器只能有一个Master主服务器

MySQL批量SQL插入性能优化

只谈情不闲聊 提交于 2019-12-06 14:47:21
对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久。因此,优化数据库插入性能是很有意义的。 经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。 1. 一条SQL语句插入多条数据。 常用的插入语句如: MySQL INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0); INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1); 1 2 3 4 INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0); INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1',

关于mysql中的锁总结

谁说我不能喝 提交于 2019-12-06 14:00:56
一、锁的基本信息: 共享锁(s):又称读锁。允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。 排他锁(X):又称写锁。允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。 大家通常以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句:update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select …for update语句,加共享锁可以使用select … lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。 意向共享锁(IS)

数据库的并发操作

时光毁灭记忆、已成空白 提交于 2019-12-06 12:52:28
数据库的并发操作 事务 事务 (Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 事务是恢复和并发控制的基本单位 事务 的 ACID 特性: 原子性 (Atomicity):事务是数据库的逻辑工作单位 一致性 (Consistency):事务执行的结果必须是使数据库从一个一致性状态变 到另一个一致性状态 隔离性 (Isolation):一个事务的执行不能被其他事务干扰 持续性 (Durability ):一个事务一旦提交,它对数据库中数据的改变就应该 是永久性的。 并发控制 事务是并发控制的基本单位 并发控制 机制的任务 对并发操作进行正确调度 保证事务的隔离性 保证数据库的一致性 并发操作带来的数据不一致性 丢失修改(Lost Update) 不可重复读(Non-repeatable Read) 幻读(Phantom Read) 读“脏”数据(Dirty Read) 丢失修改 :两个事务T-1和T-2读入同一数据并修改,T-2的提交结果破坏了T-1提交 的结果,导致T-1的修改被丢失。(修改-修改冲突) 不可重复读 :事务1读取某一数据,事务2对其做了修改;当事务1再次读该数据 时,得到与前一次不同的值(读-更新冲突) 幻读: 事务T-1按一定条件从数据库中读取了某些数据记录,事务T-2删除(插入) 了其中部分记录

1000行MySQL学习笔记,不怕你不会,就怕你不学!

旧时模样 提交于 2019-12-06 12:47:49
🔸Windows服务 -- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格) 🔸连接与断开服务器 mysql -h 地址 -P 端口 -u 用户名 -p 密码SHOW PROCESSLIST -- 显示哪些线程正在运行SHOW VARIABLES -- 显示系统变量信息 🔸数据库操作 -- 查看当前数据库 SELECT DATABASE();-- 显示当前时间、用户名、数据库版本 SELECT now(), user(), version()-- 创建库 CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项 数据库选项: CHARACTER SET charset_name COLLATE collation_name-- 查看已有库 SHOW DATABASES[ LIKE PATTERN ]-- 查看当前库信息 SHOW CREATE DATABASE 数据库名-- 修改库的选项信息 ALTER DATABASE 库名 选项信息-- 删除库 DROP DATABASE[ IF EXISTS] 数据库名 同时删除该数据库相关的目录及其目录内容 🔸表的操作 *请左右滑动阅览 -- 创建表 CREATE [

2016年总结-JAVA程序员

故事扮演 提交于 2019-12-06 11:48:47
一、技术积累 (1)代码规范 1.1.1、通常的模块分布:一般如果你要实现一个web应用,你从后台将数据展示到前端页面,在一个比较大的公司,你少不了跟其他项目有交集(你调用他的接口,他依赖你的接口),这样下来,整个公司有很多个模块,怎么做到很好的联系。回到刚刚的模块分布,你的一个web应用,应当需要分成三个模块:core模块、service模块、web模块。web模块就是展示到页面,后台代码而言主要就controller层了,其他逻辑基本都放在core了,service模块就是一些接口类和参数dto等等,接口的实现类在core模块。这样下来,web模块只需要依赖service模块,同样的其他系统依赖你的接口也仅仅是依赖service模块,然后利用远程调用方式消费你的接口服务。 1.1.2、代码层级结构:针对后台服务项目,一般分为对外接口层、service层、Dao层。Dao层就是与数据库交接的接口层,service层主要调用Dao或者外部系统的接口,复杂的逻辑基本都放在service层;一些方法需要提供给其他模块调用的时候,就封装在对外接口层,只有对外接口层是暴露。这里说的只是层级结构,还有与层级结构无关的,也是需要归类的,比如对外部系统接口方法封装的我们放在一个目录下面,一些常量和工具类等我们放在common目录下面。当然还有其他考虑,尽量让整个模块有层次感,代码才不会太乱

MySQL中事务的分类

帅比萌擦擦* 提交于 2019-12-06 11:41:39
从事务理论的角度来看,可以把事务分为以下几种类型 扁平事务(Flat Transactions) 带有保存点的扁平事务(Flat Transactions with Savepoints) 链事务(Chained Transactions) 嵌套事务(Nested Transactions) 分布式事务(Distributed Transactions) 扁平事务 是事务类型中最简单的一种,但是在实际生产环境中,这可能是使用最频繁的事务,在扁平事务中,所有操作都处于同一层次,其由BEGIN WORK开始,由COMMIT WORK或ROLLBACK WORK结束,其间的操作是源自的,要么都执行,要么都回滚,因此扁平事务是应用程序称为原子操作的的基本组成模块 下面显示了扁平事务的三种不同结果 给出的扁平事务的三种情况,同时也给出了一个典型的事务处理应用中,每个结果大概占用的百分比。再次提醒,扁平事务虽然简单,但是在实际环境中使用最为频繁,也正因为其简单,使用频繁,故每个数据库系统都实现了对扁平事务的支持 扁平事务的主要限制是不能提交或者回滚事务的某一部分,或分几个步骤提交。下面给出一个扁平事务不足以支持的例子。例如用户在旅行网站上进行自己的旅行度假计划,用户设想从杭州到意大利的佛罗伦萨,这两个城市没有直达的班机,需要用户预订并转呈航班,需要或者搭火车等待。用户预订旅行度假的事务为

今天必须搞懂事务

北慕城南 提交于 2019-12-06 10:26:36
四个特性 原子性:操作一组指令,要么全部成功,要么全部失败。 一致性:比如转账,无论你做什么操作,最后的总钱数不会改变。 隔离性:两个事务并发进行,并发事务之间要相互隔离。 持久性:事务完成后,对数据的改变是永久的。 并发事务导致的问题 脏读:一个事务读取了另一个事务未提交的数据,之后未提交的事务回滚了。 幻读:一个事务执行两次,发现查询到的数据多了,或者少了。 不可重复度:事务A读取了一个数据 num = 1,事务A还没有提交,但是事务B修改 num = 2 提交了, 事务A再次读物num的时候,发现数据变了。 脏读和不可重复读的区别:脏读是A事务读取了B事务没有提交的数据,然后B事务回滚了 ​ 不可重复读是A事务读取了B事务没有提交和提交后的数据。 事务的隔离级别 读未提交:顾名思义,就是一个事务可以读取到另一个事务没有提交的事务,可能出现脏读。 ​ 解决:Read committed (读提交) 读提交:就是一个事务需要等到另一个事务提交之后才能读取数据,可能会出现不可重复读。 ​ 解决:Repeatable read(重复读) 重复度:开始读取数据的时候(事务开启),不再允许修改操作。但是可能会出现幻读。 ​ 解决:serializable (序列化) 序列化:最高级别的事务隔离级别,事务串行化顺序执行。(一般不使用) 事务的七大传播行为 PROPAGATION