事务

mysql悲观锁总结和实践

血红的双手。 提交于 2020-01-16 01:31:48
转载于: https://www.iteye.com/blog/chenzhou123520-1860954 最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 使用场景举例:以MySQL InnoDB为例 商品goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某个商品下单时必须确保该商品status为1。假设商品的id为1。 1. 如果不采用锁,那么操作方法如下 //1.查询出商品信息 select status from t_goods where id=1; //2.根据商品信息生成订单 insert into t_orders (id,goods_id) values (null,1); //3.修改商品status为2 update t_goods set status=2; 上面这种场景在高并发访问的情况下很可能会出现问题。

Yum包管理

狂风中的少年 提交于 2020-01-16 01:21:47
Yum Yum 是Red Hat软件包管理器,它能够查询有关可用软件包的信息,从存储库获取软件包,安装和卸载软件包,以及将整个系统更新到最新的可用版本。Yum在更新,安装或删除软件包时执行自动依赖性解析,因此能够自动确定,获取和安装所有可用的依赖软件包。 Yum可以配置新的,额外的存储库或 包源 ,还提供许多增强和扩展其功能的插件。百胜可以执行许多与 RPM 相同的任务; 此外,许多命令行选项都是类似的。Yum可以在一台计算机或一组计算机上轻松简单地进行包管理。 检查和更新包 通过Yum,可以检查系统是否有等待应用的更新。可以列出需要更新的软件包并将其作为整体进行更新,也可以更新选定的单个软件包。 查询更新 要查看系统上哪些已安装的软件包具有可用更新,请使用以下命令: yum check-update yum check-update 的输出类似这样: 更新包 您可以选择一次更新单个包,多个包或所有包。如果您更新的软件包或软件包的任何依赖项本身都有可用的更新,那么它们也会更新。 更新单个包 要更新单个程序包,请运行以下命令 root : yum update 包名 yum 提供更新信息,然后提示您确认更新; yum默认以交互方式运行。如果您已经知道 yum 命令计划执行哪些事务,则可以使用该 -y 选项自动回答 yes yum请求的任何问题(在这种情况下,它以非交互方式运行)。但是

Spring事务组件 源码阅读(Spring声明式事务处理)

☆樱花仙子☆ 提交于 2020-01-16 00:41:21
1 设计原理与基本过程 在使用Spring声明式事务处理的时候,一种常用的方法是结合IoC容器和Spring已有的TransactionProxyFactoryBean对事务管理进行配置,比如,可以在这个TransactionProxyFactoryBean中为事务方法配置传播行为、并发事务隔离级别等事务处理属性,从而对声明式事务的处理提供指导。具体来说,在对声明式事务处理的原理分析中,声明式事务处理的实现大致可以分为以下几个部分: 读取和处理在IoC容器中配置的事务处理属性,并转化为Spring事务处理需要的内部数据结构,这里涉及的类是TransactionAttributeSourceAdvisor,从名字可以看出,它是一个AOP通知器,Spring使用这个通知器来完成对事务处理属性值的处理。处理的结果是,在IoC容器中配置的事务处理属性信息,会被读入并转化成TransactionAttribute表示的数据对象,这个数据对象是Spring对事物处理属性值的数据抽象,对这些属性的处理是和TransactionProxyFactoryBean拦截下来的事务方法的处理结合起来的。 Spring事务处理模块实现统一的事务处理过程。这个通用的事务处理过程包含处理事务配置属性,以及与线程绑定完成事务处理的过程

Redis入门——4.Redis事务及锁应用

一个人想着一个人 提交于 2020-01-15 23:05:14
Redis事务及锁应用 一,事务的应用 事务: 即逻辑上的一组操作,要么全部成功,要么全部失败。 参考mysql中的事务,redis为了处理实际业务同样提供了事务操作,下面我们参照mysql中的事务学习redis事务。 MySQL Redis 开启事务 begin multi 语句/命令 sql语句 普通命令 失败 rollback 回滚 discard 取消 关闭事务 commit exec 通过比较我们可以看到redis的事务命令,我们先参照mysql中的事务 模拟tom给jerry转账业务 begin; update account set money=money-1000 where username='tom'; update account set money=money+1000 where username='jerry'; commit; redis事务 启动事务 multi 回滚事务,在redis中准确的说是取消事务。而不是回滚事务 discard 提交事务 exec 案例 模拟tom给jerry转账业务 127.0.0.1:6379> multi OK 127.0.0.1:6379> set tom 300 QUEUED 127.0.0.1:6379> set jerry 300 QUEUED 127.0.0.1:6379> exec 1) OK 2) OK

block的初探

二次信任 提交于 2020-01-15 16:11:21
1、 创建一张测试表: create table t1(a integer,b varchar2(100),c varchar2(100)); insert into t1 values(1,null,'aaaa'); insert into t1 values(1,null,'bbbb'); insert into t1 values(1,1111,null); 2、 查找表(段)所在的位置: select extent_id,file_id,block_id from dba_extents where segment_name='T1'; 3、 查找12号文件是什么: select file_name from dba_data_files where file_id=12; 4、 查找具体的块号: 5、 下面用linux命令dd将3029这个块dump出来: dd if=/oradata/oracle/datafiles/NNC_DATA01_07.dbf of=g.dmp bs=8192 skip=3029 count=1 cp g.dmp /db_backup/ 6、 UE打开g.dmp文件进行查看,文件尾部: 其中 蓝色的数字代表:2c是行头,01表示改行使用了1号ITL槽,03表示这一条记录有多少个字段(3个)。 02,c1,02是第一个字段的值,这个字段是数字类型

Oracle Undo的学习

戏子无情 提交于 2020-01-15 16:07:12
回滚段 可以说是用来保持数据变化前映象而提供一致读和保障事务完整性的一段磁盘存储区域。当一个事务开始的时候,会首先把变化前的数据和变化后的数据先写入日志缓冲区,然后把变化前的数据写入回滚段,最后才在数据缓冲区中修改(日志缓冲区内容在满足一定的条件后可能被写入磁盘,但在事务提交的时候日志必须写入磁盘,而数据缓冲区中的数据依赖于检查点的发生和DBWR进程的活动) Rollback是一个代价昂贵的操作,如果一个系统的事务回退率过高,应该检查系统是否正常或者程序设计思路是否存在问题。查询数据库启动依赖的 事务回退率,如果发现太高,一定要引起重视。 --查询回退率的sql SELECT NAME, VALUE FROM v$sysstat WHERE NAME IN ('user commits', 'transaction rollbacks'); 关于回滚段的数据,如果是delete操作,则回滚段将回记录整个行的数据;如果是update,则只记录被修改了的字段的变化前的数据(前映像);如果是insert,则只记录插入记录的rowid。所以,假如commit,那么回滚段中简单标记该事务已经提交;假如rollback,则操作是 delete的话,把回滚段中的数据重新写回数据块,操作是update的话则把变化前的数据修改回去,操作是insert的话则根据rowid把该记录删除

[Java复习] 面试突击 - Spring

微笑、不失礼 提交于 2020-01-15 12:06:25
说说你对Spring 的IoC 机制 的理解? 没有Spring之前: 写一套系统,web服务器,tomcat,一旦启动之后,他就可以监听一个端口号的http请求,然后可以把请求转交给你的servlet,jsp,配合起来使用的,servlet处理请求。 比如在我们的一个tomcat + servlet的这样的一个系统里,有几十个地方,都是直接用MyService myService = new MyServiceImpl(),直接创建、引用和依赖了一个MyServiceImpl这样的一个类的对象。 这个系统里,有几十个地方,都跟MyServiceImpl类直接耦合在一起了。 如果我现在不想要用MyServiceImpl了,我们希望用的是NewServiceManagerImpl,implements MyService这个接口的,所有的实现逻辑都不同了,此时我们很麻烦,我们需要在系统里,几十个地方,都去修改对应的MyServiceImpl这个类,切换为NewServiceManagerImpl这个类。 改动代码成本很大,改动完以后的测试的成本很大,改动的过程中可能很复杂,出现一些bug,此时就会很痛苦。 归根结底,代码里, 各种类之间完全耦合在一起,出现任何一丁点的变动,都需要改动大量的代码 ,重新测试,可能还会有bug。 有Spring之后: Spring IoC,

事务ACID

此生再无相见时 提交于 2020-01-15 08:02:36
A是原子性(atomic):事务中包含的各项操作必须全部成功执行或者全部不执行。任何一项操作失败,将导致整个事务失败,其他已经执行的任务所作的数据操作都将被撤销,只有所有的操作全部成功,整个事务才算是成功完成。 C是一致性(consistent):保证了当事务结束后,系统状态是一致的。那么什么是一致的系统状态?例如,如果银行始终遵循着"银行账号必须保持正态平衡"的原则,那么银行系统的状态就是一致的。上面的转账例子中,在取钱的过程中,账户会出现负态平衡,在事务结束之后,系统又回到一致的状态。这样,系统的状态对于客户来说,始终是一致的。 I是隔离性(isolated):使得并发执行的事务,彼此无法看到对方的中间状态。保证了并发执行的事务顺序执行,而不会导致系统状态不一致。 D是持久性(durable):保证了事务完成后所作的改动都会被持久化,即使是发生灾难性的失败。可恢复性资源保存了一份事务日志,如果资源发生故障,可以通过日志来将数据重建起来。 银行转帐的例子是最经典的事务范例: 用户把钱从一个银行账号转账至另一个银行账号,需要将资金从一个银行账号中取出,然后再存入另一个银行账号中。理想来说,这两次操作都应该成功。但是,如果有错误发生,则两次操作都应该失败,否则的话,操作之后其中一个账号中的金额将会是错误的,整个操作过程应该是原子性的,两个操作都是一个原子事务操作的一部分。

数据库原理复习——不同的数据库体系结构

末鹿安然 提交于 2020-01-15 06:13:48
数据库系统运行在计算机系统上,数据库的体系结构与计算机系统的体系结构密切相关。计算机系统的体系结构结构的各个方面都反应在数据库中,本章主要就是介绍这些系统。 一、集中式系统 集中式系统是指运行在一台计算机上,不与其他计算机系统交互的数据库管理系统,包括PC上的数据库和一些大型高性能多用户的数据库管理系统。这些小型的数据库就是 故障恢复的能力 有限(只有日志和影子数据库),只支持单用户。而大型的DBMS通常是多个处理器共享一个内存,可以实现粗粒度的并行计算。每个处理器上一个查询,从而使多个查询能并行的执行,提高了吞吐量。 客户服务器系统 客户服务器系统指的是人们现在用的都是DBMS服务器而不是本地的那种。 服务器满足那些底层的内容,用户只要管用户模式下的内容就可以了。DBMS的服务又分为两类,第一种是 事务服务器 (也叫查询服务器),用户发送事务请求然后DBMS服务器把结果返回给用户,遵循一个 ODBC接口标准 ,用这个接口就可以连接任何ODBC连接的数据库;另外一种是 数据服务器 ,可以使客户向服务器发出请求,并以 文件或页面 等为单位访问数据,主要用于局域网中,客户和服务器中间的高速连接,这种情况需要把DBMS后端的所有功能都放到客户端。 二、并行数据库 对长事务(数据仓库)和大量短事务(电话公司的计费系统)的快速处理推动了并行DBMS的发展。并行系统主要性能是 吞吐量

数据库事务

眉间皱痕 提交于 2020-01-15 05:34:54
1、什么是事务 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 简单理解,事务就是对数据库一连串的操作,更新、保存和删除,对数据产生变化的操作。 2、为什么需要事务 事务的作用是保证数据准确性和一致性的一种机制。假如没有事务,那我们提交数据不会保存,有异常的时候数据不会回滚。 比如说往银行账户存钱,余额没有添加,去ATM取钱,ATM出故障没吐钱,余额变少了。 3、怎么做 在JAVA开发中通常借助Spring管理事务,大致的原理就是通过AOP在方法前后添加开始事务,提交或回滚的操作。 Spring事务管理分为声明式和编程式两种。 (1)声明式一般是写在配置文件的,它的好处是配置简便,模糊匹配对应的服务方法。 也可以通过注解的方式来开始事务,不过它也是属于声明式。 (2) 编程式 看这个名字大致可以猜出是在我们业务嵌入事务管理代码,好处是事务控制粒度更加细化,缺点是对代码有侵入性。 使用@Transactional来声明事务 当@Transactional作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该注解来覆盖类级别的定义。 @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected