事务

死锁产生的原因和解锁的方法

China☆狼群 提交于 2020-01-18 04:00:55
一.产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 二 锁的分类 锁的类别有两种分法: 1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁 MS-SQL Server 使用以下资源锁模式。 锁模式描述:   共享 (S) :读锁,用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。   更新 (U) :( 介于共享和排它锁之间 ),可以让其他程序在不加锁的条件下读,但本程序可以随时更改。   读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。当我们用UPDLOCK来读取记录时可以对取到的记录加上更新锁,从而加上锁的记录在其它的线程中是不能更改的只能等本线程的事务结束后才能更改,我如下示例: BEGIN TRANSACTION --开始一个事务 SELECT Qty FROM myTable WITH (UPDLOCK) WHERE Id in (1,2,3) UPDATE

mysql死锁问题分析

▼魔方 西西 提交于 2020-01-18 03:55:12
参考了这篇文章: http://www.cnblogs.com/LBSer/p/5183300.html 《 mysql死锁问题分析 》 写的不错。 如果Mysql死锁,会报出: 1.1 死锁成因&&检测方法 我们mysql用的存储引擎是innodb,从日志来看,innodb主动探知到死锁,并回滚了某一苦苦等待的事务。问题来了,innodb是怎么探知死锁的? 直观方法是在两个事务相互等待时,当一个等待时间超过设置的某一阀值时,对其中一个事务进行回滚,另一个事务就能继续执行。这种方法简单有效,在innodb中,参数innodb_lock_wait_timeout用来设置超时时间。 仅用上述方法来检测死锁太过被动,innodb还提供了 wait-for graph算法 来主动进行死锁检测,每当加锁请求无法立即满足需要并进入等待时,wait-for graph算法都会被触发。 1.2 innodb隔离级别、索引与锁 1.2.1 锁与索引的关系 假设我们有一张消息表(msg),里面有3个字段。假设id是主键,token是非唯一索引,message没有索引。 id: bigint token: varchar(30) message: varchar(4096) innodb对于主键使用了 聚簇索引 ,这是一种数据存储方式,表数据是和主键一起存储,主键索引的叶结点存储行数据。对于普通索引

基础篇(一)seata简介

╄→гoц情女王★ 提交于 2020-01-18 00:10:07
所有文章 https://www.cnblogs.com/lay2017/p/12078232.html 正文 原本打算业务时间把事务相关的东西都研究一下,结果人的惰性果然是可以打败一切的,工作忙总是一个很好的借口。于是乎希望走个捷径,直接上手seata这款阿里巴巴发布的分布式事务中间件。寄希望于对这块中间件的阅读获得比较多的事务知识内容。 本文是seata的第一篇,将做一些简要的介绍,有个初步的了解。 什么是seata? seata全称是: s imple e xtensiable a utonomous t ransaction a rchitecture,中文直译就是:简单的、可扩展的、自治的事务架构。 seata是一款开源的分布式事务的解决方案,致力于提供简单易用、高性能的服务。 同时,seata支持多种模式 1、at模式 2、tcc模式 3、saga模式 4、xa模式 总的来说,seata提供了分布式事务的一站式解决方案。 在此之前,seata的原名叫做fescar。 fescar全称是: f ast e a s y c ommit a nd r ollback,中文直译就是:快速、简单地提交和回滚。fescar这个名字非常简单粗暴地表达了它具备的高性能特征。 而从fescar到seata,也就意味着这款分布式事务中间件已经取得了阶段性的成果。 简要发展史

MySQL事务的实现原理

[亡魂溺海] 提交于 2020-01-17 21:38:58
特点 原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability) 一、事务的目的 1、可靠性和并发处理 可靠性:数据库要保证当insert或update操作时抛异常或者数据库crash的时候需要保障数据的操作前后的一致,想要做到这个,我需要知道我修改之前和修改之后的状态,所以就有了undo log和redo log。 并发处理:也就是说当多个并发请求过来,并且其中有一个请求是对数据修改操作的时候会有影响,为了避免读到脏数据,所以需要对事务之间的读写进行隔离,至于隔离到啥程度得看业务系统的场景了,实现这个就得用MySQL 的隔离级别。 二、实现事务功能的三个技术 1、日志文件(redo log 和 undo log) 2、锁技术 3、MVCC 1.1 redo log 与 undo log介绍 1.1.1redo log 什么是redo log ? redo log叫做重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。 当事务提交之后会把所有修改信息都会存到该日志中。假设有个表叫做tb1(id,username) 现在要插入数据(3,ceshi) start transaction; select

MySQL数据库之--事物机制

假如想象 提交于 2020-01-17 21:30:30
事物机制 5.0版本后出现的,解决: 避免写入直接操作数据文件,直接操作数据文件是很危险的事 MySQL有5种日志文件,其中只有redo日志和undo日志与事物有关 RDBMS=SQL语句 + 事务(ACID) 原子性 事务是一个或者多个SQL语句组成的整体,要么全部执行成功,要么全都执行失败 ,事务执行之后,不允许停留在中间某个状态 把10部门中MANGER员工调往20部门,其他岗位员工调往30部门,然后删除10部门 事务: 开启事务 UPDATE语句 DELETE语句 提交事务 默认情况下,MySQL执行每条SQL语句都会自动开启和提交事务 为了让多条SQL语句纳入一个事务下,可以手动管理事务 START TRANSACTION; SQL语句 [COMMIT | ROLLBACK]; COMMIT:持久化提交 ROLLBACK:回滚 START TRANSACTION; -- 启动事务机制 delete from t_emp; delete from t_dept; SELECT * FROM t_emp; SELECT * FROM t_dept; -- COMMIT; -- 提交同步(给注释掉了) ROLLBACK ; -- 回滚不同步 事务的一致性 不管在任何给定的时间\并发事务有多少, 事务必须保证运行结果的一致性,不允许数据歧义 隔离性

JDBC简介

删除回忆录丶 提交于 2020-01-17 20:43:43
JDBC操作数据库的步骤 ? 注册数据库驱动。 建立数据库连接。 创建一个Statement。 执行SQL语句。 处理结果集。 关闭数据库连接 代码如下 JDBC中的Statement 和PreparedStatement,CallableStatement的区别? 区别: PreparedStatement是预编译的SQL语句,效率高于Statement。 PreparedStatement支持?操作符,相对于Statement更加灵活。 PreparedStatement可以防止SQL注入,安全性高于Statement。 CallableStatement适用于执行存储过程。 JDBC中大数据量的分页解决方法? 最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。 说说数据库连接池工作原理和实现方案? 工作原理: JAVA EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。 实现方案: 连接池使用集合来进行装载,返回的Connection是原始Connection的代理

JDBC之简介

梦想的初衷 提交于 2020-01-17 20:09:16
5、JDBC的API java.sql包和javax.sql包 DriverManager类(驱动管理器),它可以创建连接,它本身就是一个创建Connection的工厂(Factory)。 Driver接口 入口 Connection接口,会根据不同的驱动产生不同的连接 Statement接口,发送sql语句 ResultSet接口(结果集),是用来接收select语句返回的查寻结果的。其实质类似于集合。 以上的资源都需要释放,释放的是数据库的资源 JDBC应用步骤 1,注册加载一个driver驱动 2,创建数据库连接(Connection) 3,创建一个Statement(发送sql) 4,执行sql语句 5,处理sql结果(select语句) 6,关闭Statement 7,关闭连接Connection。 注意:6,7两个步骤势必须要做的,因为这些资源是不会自动释放的,必须要自己关闭 访问Oracle的数据库的驱动名字叫o加到环境变量PATH中。 jdbc14.jar,这个jar文件中出访的驱动程序的.class文件 要使用这个驱动程序,要先将他 一,注册加载驱动driver,也就是强制类加载 1 、 Class.forName(driver); driver = "oracle.jdbc.driver.OracleDriver"; 2 、 Driver d=new

数据库事务学习

て烟熏妆下的殇ゞ 提交于 2020-01-17 18:04:13
数据库事务:    概念 : 数据库事务是构成单一逻辑工作单元的操作集合   概念解释:       1.数据库事务可以包含一个或多个数据库操作,但这些操作构成一个 逻辑上的整体 。       2.构成逻辑整体的这些数据库操作, 要么全部执行成功,要么全部不执行 。       3.构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,即不管事务是否执行成功, 数据库总能保持一致性状态 。       4.以上即使在数据库出现故障以及并发事务存在的情况下依然成立。    原子性(Atomicity):事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。 一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。           一致性状态是指:1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等)                  2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。 隔离性(Isolation):并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。 持久性(Durability):事务一旦提交,其对数据库的更新就是持久的。任何事务或系统故障都不会导致数据丢失。

spring 事务回滚

风格不统一 提交于 2020-01-17 08:27:54
1、遇到的问题   当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下: public method() { Dao1.save(Person1); Dao1.save(Person2); Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中 Dao1.save(Person2); }   期待的情况:发生错误之前的 所有数据库保存操作都回滚 ,即不保存   正常情况:前面的数据库操作会被执行,而发生数据库操作错误开始及之后的所有的数据保存操作都将失败。这样子应该都不是我们要的结果吧。   当遇到这种情况,我们就可以使用Spring的事务解决这个问题。 2、异常的一些基本知识 1) 异常的架构   异常的继承结构:Throwable为基类,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception。Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。 2)Error异常   Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能中止运行,例如JAVA 虚拟机出现错误。Error是一种unchecked Exception

事务(包含Java程序)

倾然丶 夕夏残阳落幕 提交于 2020-01-17 06:02:30
什么是事务 事务是一个工作单元,该单元内的所有操作是一个整体,要么全部执行成功,要么就全部失败。只要有任一个单元操作失败,则操作全部失败。 注意 :事务主要加在对数据库数据发送改变的操作中,例增删改,像查询则不需要事务 为什么需要事务 SQL语句只能执行一条,而事务可以把多个SQL语句组成一个事务,同时执行 事务的四大特性(ACID) 标记: 面试题 1、 原子性(Atomicity) :事务中的所有操作是不可再分割的原子单位,要么全部成功,要么全部失败 标记: 红色 2、 一致性(Consistency) :事务执行后,数据库状态与其他业务规则保持一致。 标记: 红色 如: 转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。 3、 隔离性(Isolation) :隔离性是指在并发操作中,不同事务之间应该隔离起来,使每个并发中的事务不会互相干扰 标记: 红色 4、 持久性(Durability) :一旦事务提交成功,事务中的所有操作都必须被持久化到数据库中,即使提交事务后,数据库马上奔溃,在数据库重启时,也必须能保证通过某种机制恢复数据 标记: 红色 MySQL中的事务 标记: 红色 例: #胡一刀给胡一菲转账500元 START TRANSACTION ; UPDATE bank SET cmoney = cmoney + 500 WHERE cname =