数据库事务

oracle 存储过程

孤街醉人 提交于 2019-12-26 07:28:40
1,procedure 是一个可以用编程的方式来操作SQL的集合; 存储过程的优点? 执行效率很高,因为存储过程是预编译的,即创建时编译,而SQL语句是执行一次,编译一次。调用存储过程可以大大减少同数据库的交互次数。 降低网络通信量,因为存储过程执行的时候,只需要call存储过程名,不需要传递大量的SQL语句。 有利于复用。 存储过程的缺点? 移植性非常差,如果在oracle上写的存储过程,移植到mysql需要修改。 代码可读性差,实现一个简单的逻辑,代码会非常长。 存储过程的用途? 造测试数据:可以使用存储过程,往表里造几百万条数据。 数据同步:两个表之间按照一定的业务逻辑进行数据同步。 数据挖掘。 存储过程注意事项? 数据量大的时候(10万+),一定要做压力测试,有些存储过程在大数据量的情况下才会出现问题。 如果插入或者更新的次数比较多,为了提高效率,可以执行一万次,再commit一次。 如果先插入记录,没有commit,再对这条记录进行更新,会引起死锁。如果先后对同一笔记录进行更新,又没有commit,也会引起死锁。因为后一条语句会等待前一条语句提交。如果出现这种情况,则需要一条条commit。 不要忘记在存储过程里写commit。 2,Oracle什么时候需要commit? DML语言,比如update,delete,insert等 修改表中数据 的需要commit;

分布式事务原理解析

蹲街弑〆低调 提交于 2019-12-26 07:14:59
1. 分布式事务原理解析 1.1. TCC分布式事务 了解过TCC分布式事务的都知道它有三个阶段:try,confirm,cancel,但很多文章就只有原理图,和对原理图的解释,看一遍也留不下印象,这里用实际场景举个例子,说明TCC分布式事务原理 try阶段:假设我们又订单系统,它需要调用库存和积分系统,try阶段我们进行的是 预处理 ,比如下单1个商品,在try操作中,我们在库存表设置个冻结字段,表示冻结1个商品,商品的存量先不扣除,而积分表同样添加个预增加积分字段,添加个预积分比如10 confirm阶段: 我们为什么要经历try阶段? ,为了尽可能的保证各个系统都是正常工作的,数据库,服务都没有挂掉,资源没有不足,则可以最大程度上保证confirm阶段能正确执行, confirm阶段也就是正式的扣除库存和增加积分 cancel阶段: 若try阶段执行错误 ,则会对前面已经执行的try阶段的系统执行cancel操作,也就是反向SQL回滚,冻结的商品-1,预积分-10。到这里有没有疑问?我首先想到的是 若confirm或cancel操作再执行失败怎么办 ?这里就要由TCC分布式事务框架保证了,它会 记录事务活动日志 ,再confirm或cancel失败后不断尝试调用confirm和cancel的逻辑,所以这里需要开发者自己保证,你的SQL是正确的 TCC分布式框架推荐

【面试】MySQL的事务和索引

徘徊边缘 提交于 2019-12-26 05:17:44
MySQL事务 MySQL事务主要用于处理操作量大,复杂度高的数据。 比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这些数据库操作语句就构成一个事务。 (1)在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。 (2)事务处理可以用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行。 (3)事务用来管理insert,update,delete语句。 一般来说,事务必须满足4个条件(ACID):Atomicity(原子性)、Consisttency(稳定性)、Isolation(隔离性)、Durability(可靠性)。 (1)事务的原子性:一组事务,要么成功,要么撤回。 (2)事务的稳定性:有非法数据(外键约束之类的),事务撤回。 (3)事务的隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,要么其他事务会撤回。事务的100%的隔离,需要牺牲速度。 (4)事务的可靠性:软、硬件崩溃后,InnoDB数据库驱动会利用日志文件重构修改,可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit选项,决定什么时候把事务保存到日志里。 在MySQL控制台使用事务来操作: (1)开始一个事务 start transaction (2)做保存点

MyBatis源码解析(三)——Transaction事务模块

烈酒焚心 提交于 2019-12-26 04:52:00
原创作品,可以转载,但是请标注出处地址: http://www.cnblogs.com/V1haoge/p/6634151.html 1、回顾   之前介绍了Environment环境类,这其实是一个单例类,在MyBatis运行开启后只会存在一个唯一的环境实例,虽然我们可以在Configuration配置文件中配置多个环境,但是项目运行中只会存在其中的一个,一般项目会存在开发环境和测试环境、生产环境三大环境,其是否可以设置到配置文件中,在开发时使用开发环境,测试时使用测试环境,正式运营时可以使用生产环境。   之前还提到Environment类中有三个字段,除了id之外,TransactionFactory和DataSource都是比较复杂的模块,这一次我们介绍Transaction模块(即事务模块)。 2、事务模块   事务模块位于 org.apache.ibatis.transaction 包,这个包内的类均是事务相关的类:   org.apache.ibatis.transaction   -----org.apache.ibatis.transaction.jdbc   ----------JdbcTransaction.java   ----------JdbcTransactionFactory.java   -----org.apache.ibatis

Mysql数据库表的类型有哪些

家住魔仙堡 提交于 2019-12-26 03:43:45
截至目前,MySQL一共向用户提供了包括DBD、HEAP、ISAM、MERGE、MyIASM、InnoDB以及Gemeni这7种Mysql表类型。其中DBD、InnoDB属于事务安全类表,而其他属于事务非安全类表。 DBD Berkeley DB(DBD)表是支持事务处理的表,由Sleepycat软件公司开发。它提供MySQL用户期待已久的功能--事务控制。事务控制在任何数据库系统中都是一个极有价值的功能,因为它们确保一组命令能成功地执行或回滚。 HEAP HEAP表是MySQL中存取数据最快的表。这是因为他们使用存储在动态内存中的一个散列索引,不过如果MySQL或服务器崩溃,这些内存数据将会丢失。 ISAM ISAM表是早期MySQL版本的缺省表类型,直到MyIASM开发出来。建议不要再使用它。 MERGE MERGE是一个有趣的新类型,在3.23.25之后出现。一个MERGE表实际上是又一个MyISAM表的集合,合并而成的一个表,主要是为了效率的考虑,因为这样不仅仅可以提高速度、搜索效率、修复效率而且还节省了磁盘空间。 MyIASM MyIASM基于了IASM代码,应该可以说是IASM的衍生品,不过增加了不少有用的扩展。它是MySQL的默认数据表类型,基于了传统的ISAM类型,ISAM是Indexed Sequential Access Method(有索引的顺序访问方法

Mysql高级— 事务

烂漫一生 提交于 2019-12-26 00:41:46
事务 1. 为什么要有事务 事务广泛的运用于订单系统、银行系统等多种场景 例如: A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事: 检查A的账户余额>500元; A 账户中扣除500元; B 账户中增加500元; 正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜。 那如果A账户扣了钱之后,系统出故障了呢?A白白损失了500,而B也没有收到本该属于他的500。 以上的案例中,隐藏着一个前提条件:A扣钱和B加钱,要么同时成功,要么同时失败。事务的需求就在于此 事务定义 所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位 例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性 假如一个银行的数据库有两张表:支票表(checking)和储蓄表(savings)。现在要从用户Jane的支票账户转移200美元到她的储蓄账户,那么至少需要三个步骤: 1.检查支票账户的余额高于或者等于200美元。 2.从支票账户余额中减去200美元。 3.在储蓄帐户余额中增加200美元。 上述三个步骤的操作必须打包在一个事务中,任何一个步骤失败,则必须回滚所有的步骤。 事务四大特性(简称ACID)

JDBC的事务处理

瘦欲@ 提交于 2019-12-26 00:17:06
JDBC的事务处理 事务,也是数据库事务,指的是作为单个逻辑工作单元执行的一系列操作。正常的情况下,操作应该顺利进行,与操作相关的所有数据库信息也成功地更新; 但是,如果在这一系列过程中任何一个环节出了差错,导致操作失败了,数据库中所有信息都必须保持操作前的状态不变。否则,数据库的信息将会一片混乱而不可预测。 一个逻辑工作单元要称为事务,必须满足ACID(原子性,一致性,隔离性和持久性): http://baike.baidu.com/view/600227.htm 事务的结束只能有两种形式:提交和回滚。操作完全成功则提交,产生永久性的修改;操作不完全成功则回滚,恢复到事务开始前的状态。它们将结束一个事务。 (1)关闭自动提交事务。通过设置连接的自动提交事务属性为false,如下: ? Connection conn = DriverManager.getConnection( "连接URL" , "用户名" , "密码" ); //关闭自动提交事务 conn.setAutoCommit( false ); (2)如果执行顺利,提交事务;一旦发生异常,回滚(rollback)事务,如下: ? try { conn.setAutoCommit( false ); //关闭自动提交事务 stmt = conn.createStatement(); //创建会话 stmt

使用sysbench对mysql压力测试

旧时模样 提交于 2019-12-25 22:30:07
sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。关于这个项目的详细介绍请看: https://github.com/akopytov/sysbench 。 它主要包括以下几种方式的测试: cpu性能 磁盘io性能 调度程序性能 内存分配及传输速度 POSIX线程性能 数据库性能(OLTP基准测试) sysbench的数据库OLTP测试支持MySQL、PostgreSQL、Oracle,目前主要用于Linux操作系统,开源社区已经将sysbench移植到了Windows,并支持SQL Server的基准测试。 废话不多说,开始。 1. sysbench安装 mysql版本: mysql-community-server-5.6.29 OS: CentOS 6.7 X86_64 sysbench 0.5相比0.4版本有一些变化,包括oltp测试结合了lua脚本,还多了一些隐藏选项,本文会涉及得到一部分。 目前许多仓库里已编译好的二进制sysbench还是0.4.x版本,不过现在主流也还是github上的0.5(我这里使用的是1.0),可以从 这里 下载0.5版本的rpm包直接安装,不过我选择自己编译,因为只有这个办法是通用的。 // 先安装编译依赖环境 $ sudo yum install gcc gcc-c++

golang--- Redis 操作

别来无恙 提交于 2019-12-25 20:19:01
1. Redis简介 Redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。 1.1 特点 支持更多数据类型 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set 有序集合)和hash(哈希类型)。 [1] 支持复杂操作 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。 [2] 支持主从同步。 与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。 Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部

PlatformTransactionManager

南楼画角 提交于 2019-12-25 14:04:48
详见:https://www.cnblogs.com/softidea/p/5877546.html Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。 关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。 你可以在启动类中添加如下方法,Debug测试,就能知道自动注入的是 PlatformTransactionManager 接口的哪个实现类。 @EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven /> @SpringBootApplication public class ProfiledemoApplication { @Bean public Object