数据库事务

mysql: lock wait timeout exceeded; try restarting transaction

丶灬走出姿态 提交于 2020-02-17 06:48:07
项目中遇到: lock wait timeout exceeded; try restarting transaction 的问题。 出错的语句是: select id from A where id=1 for update 即锁等待超时, 可能原因分析:并发场景下有一个事务对表A的id等于1的记录进行select for update操作,开启了事务但是并未提交,此时另外的事务对表A的事务操作就会等待锁,最终等待超时报错。 需要检查代码中对事务的开启、提交方面是否有问题。需要保证代码中再进行完for update操作后,事务一定提交或回滚。 Mysql 数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错,可以考虑调大innodb_lock_wait_timeout参数的值,或者在代码中增加重试操作,等待另一个事务提交,流程则可继续进行。 来源: CSDN 作者: 怠惰的小小白 链接: https://blog.csdn.net/qq_35462323/article/details/104338645

MySQL锁与事务隔离级别

主宰稳场 提交于 2020-02-16 22:39:21
1、概述 (1) 锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除了传统的计算资源(如CPU、RAM、IO等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 (2) 锁的分类 从性能上分为 乐观锁 和 悲观锁 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。 例子:① 在数据库的表中加一个version字段,用来记录每次修改数据的版本号,防止并发修改数据出错;② CAS原子类。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。 例子:synchronized关键字。 从对数据库操作的类型分为 读锁 和 写锁 (都属于悲观锁) 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。 写锁(排它锁):当前写操作没有完成前,它会阻断其他session的写锁和读锁。(session:数据库连接) 从对数据操作的粒度分为 表锁 和 行锁 。 2、表锁与行锁 (1) 表锁( 偏读 ) 表锁偏向MyISAM存储引擎 ,开销小,加锁快,无死锁

Innodb核心特性——事务

拟墨画扇 提交于 2020-02-16 18:18:49
Innodb核心特性——事务 一、什么是事务? 主要针对DML语句(update,delete,insert) 一组数据操作执行步骤,这些步骤被视为一个工作单元: 1)用于对多个语句进行分组 2)可以在多个客户机并发访问同一个表中的数据时使用 所有步骤都成功或都失败 1)如果所有步骤正常,则执行 2)如果步骤出现错误或不完整,则取消 二、事务通俗的理解 伴随着“交易”出现的数据库概念。 我们理解的“交易”是什么? 1)物与物的交换(古代) 2)货币现金与实物的交换(现代1) 3)虚拟货币与实物的交换(现代2) 4)虚拟货币与虚拟实物交换(现代3) 数据库中的“交易”是什么? 1)事务又是如何保证“交易”的“和谐”? 2)ACID # 10.0.0.51的第一个窗口 # 1.创建一个转账表 mysql> use test mysql> create table jiaoyi; mysql> insert into jiaoyi values('msy',1000), mysql> select * from jiaoyi; +------+-------+ | name | money | +------+-------+ | msy | 1000 | | hjm | 1000 | +------+-------+ # 2.开始事务 mysql> begin; # 3.更改数据

mysql事务

☆樱花仙子☆ 提交于 2020-02-16 18:13:22
什么是事务 一系列有序的数据库操作: 要么全部成功 要么全部回退到操作前状态 中间状态对其他连接不可见 事务的基本操作 基本操作 说明 start transaction; 开始事务 commit; 提交(全部完成) rollback; 回滚(回到初始状态) 图中便是数据库中的事务操作;及 开始事务-->SQL操作-->commit/rollback; savepoint,保存点,在事务回滚时,可以回滚到保存点; 而提交只能全部提交不能仅提交保存点; savepoint savepoint_name; rollback to savepoint_name; commit; 事务开始也可以用 begin;或者 start transaction; 清空表数据: mysql> select * from ttt; +---+------+------+ | a | b | c | +---+------+------+ | 1 | 1 | 1 | +---+------+------+ 1 row in set (0.00 sec) mysql> truncate table ttt; Query OK, 0 rows affected (0.01 sec) mysql> select * from ttt; Empty set (0.00 sec) 当多个连接同时连在一个数据库中时

Spring编程式事务管理的简单实现

懵懂的女人 提交于 2020-02-16 12:05:30
一个很简单的Spring JDBC 编程式事务的简单实现,代码逻辑较简单,希望有可能帮助初学的同学。本例使用mysql8.0,在db3数据库下有个student表,内含两个属性,id与name。 import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; public class JdbcTemplateTest { public static void

mysql三:表操作

旧街凉风 提交于 2020-02-16 08:13:26
阅读目录 一 存储引擎介绍 二 表介绍 三 创建表 四 查看表结构 五 数据类型 六 表完整性约束 七 修改表ALTER TABLE 八 复制表 九 删除表 一 存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 1. 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的 表 ===> 文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 :比如处理文本用txt类型,处理表格用excel,处理图片用png等 数据库中的表也应该有不同的类型, 表的类型不同 ,会对应mysql不同的 存取机制 ,表类型又称为 存储引擎 。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方 法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和 操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql 数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 自己的需要编写自己的存储引擎 SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL

MySQL 中的事务

浪尽此生 提交于 2020-02-16 04:32:22
事务的应用场景说明 什么是事务: 在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的。转 账是一个用户扣钱,另一个用户加钱。如果其中有一条 SQL 语句出现异常,这条 SQL 就可能执行失败。 事务执行是一个整体,所有的 SQL 语句都必须执行成功。如果其中有 1 条 SQL 语句出现异常,则所有的 SQL 语句都要回滚,整个业务执行失败。 案例说明 转账的操作 -- 创建数据表 CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), balance DOUBLE ); -- 添加数据 INSERT INTO account (NAME, balance) VALUES ('LeeHua', 1000), ('Tom', 1000); 模拟LeeHua给Tom转 500 元钱,一个转账的业务操作最少要执行下面的 2 条语句: -- LeeHua账号-500 UPDATE account SET balance = balance - 500 WHERE name='LeeHua'; -- Tom账号+500 UPDATE account SET balance = balance + 500 WHERE name='Tom'; 假设当LeeHua账号上 -500

Spring事务管理

£可爱£侵袭症+ 提交于 2020-02-15 11:05:06
1、事务( https://www.cnblogs.com/zhai1997/p/11710082.html ) (1)事务的特性:acdi (2)事务的并发问题:丢失修改,脏读,不可重复读 (3)事务的隔离级别:1、2、4、8 2、Spring的事务管理 (1)Spring封装了事务管理的代码:打开事务、提交事务、回滚事务 在我们学习的不同阶段(JDBC、Hibernate),对事物处理的方法是不一样的,为了解决这个问题,Spring提供了一个接口,PlatformTransactionManager(平台事务管理器), 该接口可以根据不同的平台提供不同的方法来处理事务, (2)Spring管理事务的属性 事务的隔离级别:1:读未提交、2:读已提交、4:可重复读、8:串行化 本次事务是否只读:true:只读 事务的传播行为: PROPAGATION REQUIRED 支持当前事务,如果不存在就新建一个(默认) PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务PROPAGATION MANDATORY 支持当前事务,如果不存在,抛出异常PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务PROPAGATION

mysql 初识之日志文件篇

会有一股神秘感。 提交于 2020-02-15 07:49:19
日志文件 1. err日志 error log 记录mysql在运行的过程中所有较为严重的警告和错误信息,以及mysql server每次启动和关闭的详细信息。系统在默认情况下关闭error log 功能。error log 默认存放在data目录下,默认文件名为主机名.err。error log 通过两种方式开启: 1). 启动mysqld时,附加上--log-error参数 2) . 在my.cnf中配置log-error系统环境变量 当进入mysql后执行 flush logs命令后,mysql会将当前的错误日志文件附加-old文件保存,并且创建一个新的空错误日志文件,仅仅在指定--log-error的情况下。 注:error log 不全是保存是警告和错误信息,还保存每次启动和关闭的信息。 ps启动时信息: 130420 16:19:29 mysqld_safe mysqld from pid file /data0/mysql_data_7706/FZTEST-24178.pid ended 130420 16:19:30 mysqld_safe Starting mysqld daemon with databases from /data0/mysql_data_7706 error: Found option without preceding group in

乐观锁和悲观锁的区别

余生颓废 提交于 2020-02-15 06:36:54
乐观锁 在关系数据库管理系统里,乐观并发控制(又名”乐观锁”,Optimistic Concurrency Control,缩写”OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。乐观事务控制最早是由孔祥重(H.T.Kung)教授提出。 乐观并发控制的阶段 乐观并发控制的事务包括以下阶段: 1. 读取:事务将数据读入缓存,这时系统会给事务分派一个时间戳。 2. 校验:事务执行完毕后,进行提交。这时同步校验所有事务,如果事务所读取的数据在读取之后又被其他事务修改,则产生冲突,事务被中断回滚。 3. 写入:通过校验阶段后,将更新的数据写入数据库。 乐观并发控制多数用于数据争用不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。 相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。 数据版本,为数据增加的一个版本标识。当读取数据时,将版本标识的值一同读出,数据每更新一次,同时对版本标识进行更新。当我们提交更新的时候