mysql事务

JavaWeb_(Spring框架)Spring整合Hibernate

本秂侑毒 提交于 2019-12-06 04:34:23
  Dao层类要继承HibernateDaoSupport.java父类   原先使用Hibernate框架hibernate.cfg.xml配置数据库 <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///spring</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connecton.password">123456</property> <!-- 数据库的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!-- 是否显示sql语句 --> <property name="hibernate.show_sql">true</property> <!-- 是否格式化sql语句 -->

Mysql数据导入优化

帅比萌擦擦* 提交于 2019-12-06 04:16:50
1、我们在批量导入数据的时候,可以对导入数据的文件做一定优化 Load data local infile '/root/a.sql' into table order_by_1 fields terminated by ',' lines terminated by '\n' 有序数据导入效率非常高。 例如要批量导入1000万条数据如果导入数据的文件中的主键是自增主键,并且是按顺序排序的,那么在导入mysql的时候是非常高效的。 若是导入文件的内容主键是以别的字段设置的,或者也是自增主键但是不是排序好的那么在插入过程中效率是非常低下的 2关闭事务唯一性校验 如果我们再设计表的时候存在事务唯一性索引 即:'UNIQUE KEY 索引名' ('索引列') 我们再插入插入数据之前就得先关闭事务唯一性索引, 命令: set unique_checks =0 在插入完成再开启事务唯一性索引。 3手动提事务 Set autocommit=0; 当事务提交完成后再讲手动提交事务开启 来源: https://www.cnblogs.com/NZT-HJX/p/11961433.html

轻松理解MYSQL MVCC 实现机制

久未见 提交于 2019-12-06 02:24:38
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/whoamiyang/article/details/51901888 1. MVCC简介 1.1 什么是MVCC MVCC是一种多版本并发控制机制。 1.2 MVCC是为了解决什么问题? 大多数的MYSQL事务型存储引擎,如,InnoDB,Falcon以及PBXT都不使用一种简单的行锁机制.事实上,他们都和MVCC–多版本并发控制来一起使用. 大家都应该知道,锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销. 1.3 MVCC实现 MVCC是通过保存数据在某个时间点的快照来实现的. 不同存储引擎的MVCC. 不同存储引擎的MVCC实现是不同的,典型的有乐观并发控制和悲观并发控制. 2.MVCC 具体实现分析 下面,我们通过InnoDB的MVCC实现来分析MVCC使怎样进行并发控制的. InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),没开始一个新的事务,系统版本号就会自动递增

MySQL的四种事务隔离级别

北战南征 提交于 2019-12-06 02:23:15
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACID)    1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。    2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。    3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。    4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。 二、事务的并发问题   1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据   2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。   3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级

Spring中的事务回滚机制

房东的猫 提交于 2019-12-06 00:47:13
初学者笔记 问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一、特性 先了解一下@Transactional注解事务的特性,可以更好排查问题 1、service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。 2、@Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。 3、默认情况下,Spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。 辣么什么是checked异常,什么是unchecked异常 java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常,其他继承自java.lang.Exception得异常统称为Checked Exception,如IOException、TimeoutException等   通俗一点:你写代码出现的空指针等异常,会被回滚,文件读写,网络出问题,spring就没法回滚了

Laravel 事务中使用悲观锁

喜夏-厌秋 提交于 2019-12-05 22:48:37
laravel 提供了方便快捷的数据库事务使用方式,在使用中遇到过几个容易混淆和被误导的地方,这里做个记录,希望哪里写的不对的地方各位大神指点一下 laravel 事务分为手动方式和自动方式。 但如果我们在使用 laravel 提供的 sharedLock 或者 lockForUpdate 锁表的方式,为了避免不必要的麻烦和错误,建议最好使用手动提交事务来处理,如下图: 下面来说说 sharedLock (共享锁) 和 lockForUpdate (悲观锁) 这两个在使用上的区别和影响 sharedLock (共享锁) sharedLock 使用时等同于 SQL 语句 select from transaction_test where type = 1 lock in share mode; 在事务中使用 sharedLock 时才会生效,会把数据所在行进行锁定,此时被锁定的数据,不允许被其他操作修改,但是被锁定的数据,对查询操作没有影响,无论是普通查询还是事务中的查询操作,都不会受到影响。 被锁定的数据,知道事务被提交或者回滚之后,才会释放. lockForUpdate (悲观锁) lockForUpdate 使用时等同于 SQL 语句 select from transaction_test where type = 1 for update; lockForUpdate

MySQL批量SQL插入各种性能优化

北慕城南 提交于 2019-12-05 20:47:59
对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久。因此,优化数据库插入性能是很有意义的。 经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。 1. 一条SQL语句插入多条数据。 常用的插入语句如: 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); 修改成: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1); 修改后的插入操作能够提高程序的插入效率。这里第二种SQL执行效率高的主要原因是合并后日志量

MySQL批量SQL插入性能优化

删除回忆录丶 提交于 2019-12-05 20:46:50
对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,可能每天花费在数据导入上的时间就会长达几个小时之久。因此,优化数据库插入性能是很有意义的。 网络上的牛人很多,总会有一些手段可以提高insert效率,大家跟我一起分享一下吧: 1. 一条SQL语句插入多条数据。 我们常用的插入语句大都是一条一个insert,如: 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); 现在我们将它修改成: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1); 【数据对比】 下面是网上牛人提供一些测试对比数据

mysql 事务

女生的网名这么多〃 提交于 2019-12-05 20:30:58
事务 ACID 特性 原子性 ( A tomicity): 事务中的所有操作,要么全部成功,要么全部失败回滚到最初状态,不会结束在中间的某个环节 一致性 ( C onsistency): 事务开始之前和结束之后,数据库的完整性没有被破坏,写入的数据必须完全符合所有的预设约束,触发器,级联回滚等等 隔离性 ( I solation): 数据库并发事务同时对其数据进行读写和修改,隔离性可以防止并发事务交叉执行而导致数据不一致 持久性 ( D urability): 事务处理结束后,对数据的修改是永久的,即使系统故障也不会丢失 事务的并发问题 脏读 : 一个事务读取另一个事务未更新的数据 不可重复读 : 一个事务读取同一个行数据两次得到不同的结果 幻读 : 两次范围查询,第二次查询出现第一次更多或者更少的数据 丢失更新1 : 两个事务同时更新一行数据,其中一个事务撤销时覆盖另一个事务 丢失更新2 : 两个事务同时更新一行数据,其中一个事务提交时覆盖另一个事务 事务的隔离级别 读未提交 (Read uncommitted): 允许脏读/不可重复读/幻读/丢失更新2;修改数据时加行级共享锁至事务结束 读已提交 (Read committed): 允许不可重复读/幻读/丢失更新2,一个事务只能读取另一个事务已提交的数据;修改数据时加行级排它锁至事务结束 可重复读 (Repeatable

分布式事务之解决方案(TCC)

久未见 提交于 2019-12-05 17:59:46
4. 分布式事务解决方案之TCC 4.1. 什么是TCC事务 TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作 :预处理Try、确认Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作既回滚操作。TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试。 分支事务失败的情况 : TCC分为三个阶段 : Try阶段是做业务检查(一致性)及资源预留(隔离),此阶段仅是一个初步操作,它和后续的Confirm一起才能真正构成一个完整的业务逻辑。 Confirm阶段是做确认提交,Try阶段所有分支事务执行成功后开始执行Confirm。通常情况下,采用TCC则认为Confirm阶段是不会出错的。即 :只要Try成功,Confirm一定成功。若Confirm阶段真的出错了,需引入重试机制或人工处理。 Cancel阶段是在业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放。通常情况下,采用TCC则认为Cancel阶段也是一定成功的。若Cancel阶段真的出错了