数据库死锁,并发问题

数据库死锁,并发问题,第1张

补充楼主:

其实我没什么经验,只不过是了解一些基础的东西罢了。

一楼的 一朵瘩红花 实际经验很丰富,你可以向她咨询一下。

你问的问题挺好得。三个概念紧密联系在一起。

这样说吧:并发的几个事务同时发生,不加锁控制的话数据就会乱套了,而加了锁后,又是并发访问会出现死锁,所以就会出现避免死锁的一些措施。

首先谈并发:理论指的是在一段时间同时对某件事进行 *** 作。 注意精度问题,修改数据库是在一段时间内 *** 作,不是在某个时刻,而日志则会从 时刻 开始记录你的 *** 作。

造成死锁的原因是为了防止 不同的用户同时间(不是时刻)都对某个数据修改,造成访问不一致的问题。

比如你读了数据库的一个数据然后把它修改了并存回去,是需要时间的(假如是student表中的有个grade属性,你改了一条记录的一个值)在这个过程当中,有人又访问了数据库并且恰恰访问的是存回去之前的数据,然后他要进行 *** 作,过了一段时间,此时你已经存回去了数据。会发现原来的数据被改动了。这时数据就乱套了。(专业术语叫读脏数据,其实还有很多其他类似这种导致前后数据不一致的问题)所以为了限定这种 *** 作,数据库设计了-----锁---来锁定这种 *** 作。就是你正在 *** 作某个数据的时候----通常之前会先锁定这个数据,这样别人就不能对此数据 *** 作了(严格来说就是只能读,不能改),必须等你 *** 作完才能对此数据修改等 *** 作,这就在一定程度上避免了前后 *** 作数据不一致的问题。

但是有了锁后,新问题出现了,就是死锁:

简单解释死锁:进程A等待进程B释放他的资源,B又等待A释放他的资源,这样就互相等待就形成死锁

官方解释死锁

死锁,根本原因在于对共享存储区的访问。在数据库中也一样,如果需要“修改”一条数据,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事务能进行修改 *** 作。锁有多种实现方式,比如意向锁,共享-排他锁,锁表,树形协议,时间戳协议等等。锁还有多种粒度,比如可以在表上加锁,也可以在记录上加锁。

在并发控制中,锁是非常重要的。

至于在Oracle还是别的数据库管理系统中,死锁产生的原因没有不同,不同的顶多是锁的实现或者死锁的恢复等罢了

再来说说事务:

事务简单来说就是 一系列的对数据库的 *** 作揉在一起,要么同时完成,要么就都不完成。

比如---你要取钱的过程就可以当成是一个小的事务: 插卡,输入取钱金额,取走钱,拿出来卡。此过程缺一不可。把所有这些过程细节封装起来就成为一个事务。

以oracle数据库为例:

一个事务(你可以认为是一系列业务的 *** 作)起始于dml语句(insert、update、delete)

即一条dml语句就做为一个事务的起始,然后根据业务需要,进行其他的dml *** 作都算是事务的一部分。

最后碰到commit。或者rollback,或者其他意外什么的都算作一个事务的结束。

整个过程就是一个事务。

事务的理论解释就是那四个什么特性:什么原子性、一致性、隔离性和持久性

简称ACID

剩下的:数据库是建立在 *** 作系统之上的一个层次。

你问的是数据库的存储机制??工作机制??还是什么的??

数据库就是存数据的。数据库管理系统是 对存的数据进行高效率的管理

大的结构分物理数据跟逻辑数据。

物理数据就是数据在存储设备上的存储方式,什么物理联系,物理结构,物理记录等 术语。

逻辑数据就是程序员和用户看到的数据形式。什么逻辑联系,逻辑结构==同上

数据库管理类系统就是把这些逻辑跟物理相互转换。 好比你输入的叫逻辑数据存储在磁盘上叫物理数据。等等。

废话了一堆,也不知道回答对你的问题没~~

很容易混淆,这就是“实例”(instance)和“数据库”(database)。作为Oracle术语,这两个词的定义如下:

q 数据库(database):物理 *** 作系统文件或磁盘(disk)的集合。使用Oracle 10g的自动存储管理(Automatic Storage Management,ASM)或RAW分区时,数据库可能不作为 *** 作系统中单独的文件,但定义仍然不变。

q 实例(instance):一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程所共享。这里可以维护易失的、非持久性内容(有些可以刷新输出到磁盘)。就算没有磁盘存储,数据库实例也能存在。也许实例不能算是世界上最有用的事物,不过你完全可以把它想成是最有用的事物,这有助于对实例和数据库划清界线。

这两个词有时可互换使用,不过二者的概念完全不同。实例和数据库之间的关系是:数据库可以由多个实例装载和打开,而实例可以在任何时间点装载和打开一个数据库。实际上,准确地讲,实例在其整个生存期中最多能装载和打开一个数据库!稍后就会介绍这样的一个例子。

是不是更糊涂了?我们还会做进一步的解释,应该能帮助你搞清楚这些概念。实例就是一组 *** 作系统进程(或者是一个多线程的进程)以及一些内存。这些进程可以 *** 作数据库;而数据库只是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件)。在任何时刻,一个实例只能有一组相关的文件(与一个数据库关联)。大多数情况下,反过来也成立:一个数据库上只有一个实例对其进行 *** 作。不过,Oracle的真正应用集群(Real Application Clusters,RAC)是一个例外,这是Oracle提供的一个选项,允许在集群环境中的多台计算机上 *** 作,这样就可以有多台实例同时装载并打开一个数据库(位于一组共享物理磁盘上)。由此,我们可以同时从多台不同的计算机访问这个数据库。Oracle RAC能支持高度可用的系统,可用于构建可扩缩性极好的解决方案。

q 数据库可以由一个或多个实例(使用RAC)装载和打开。

想要避免此类现象再次发生,在我个人看来有两个方法。第一加强工作人员责任心,在遇到同名童星老人,又采用纸质核酸码采样情况下,一定要将其区分开,避免核酸采样过程中混淆。第二采样前复核采样人员个人情况,这样能够及时发现错误,并有利于纠正错误。

事情发生在上海一老人身上,该老人已经离世一个月时间,其核酸报告却仍然在更新。这一情况引起了家属注意,并反馈给了管理部门。经过管理部门人员调查,发现老人生前所在养老院,存在同名同姓老人,工作人员弄错了核酸码,才会出现这样情况。

事情虽然得到处理和解决,但带给家属的伤害,以及网友猜忌,并不会立刻消失。想要防止此类情况再现,应该做好下面两个方面工作。

一、加强日常核酸管理和工作人员责任心

会有这样事情发生,在我个人看来,同工作人员工作过程不够认真、细致有一定关系。老人在离开以后,就应该及时销毁核酸码,不能够再让核酸码,留存在养老院,并被同名同姓老人使用。工作人员有责任心后,也就能够仔细应对工作,从而减少工作中,犯错误概率。

二、连通数据库,利用大数据发现明显错误

老人去世以后,公安系统一定会登记,注销老人户籍,记录老人状态为离世。将户籍系统同核酸系统连通后,就能够利用大数据,查找到这些明显错误。

已经标注“离世”老人,不可能有核酸检测记录存在。对于这样一个错误,由电脑系统来寻找,会比人工更快捷、准确。

希望经过这件事情后,核酸检测结果,不再出现大的疏忽。每一次疏忽,都可能对人们生活和出行带来影响。

在MySQL中创建一个Schema好像就跟创建一个Database是一样的效果,在SQLServer和Orcal数据库中好像又不一样目前我只能理解,在mysql中schemadatabase。\x0d\\x0d\数据库中User和Schema的关系\x0d\假如我们想了解数据库中的User和Schema究竟是什么关系,首先必须了解一下数据库中User和Schema到底是什么概念。\x0d\\x0d\在SQLServer2000中,由于架构的原因,User和Schema总有一层隐含的关系,让我们很少意识到其实User和Schema是两种完全不同的概念,不过在SQLServer2005中这种架构被打破了,User和Schema也被分开了。\x0d\\x0d\\x0d\首先我来做一个比喻,什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User?我们可以可以把\x0d\Database看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个\x0d\Schema中的床,Table(床)就被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了J。,然后床上可以放置很多物品,就好比\x0d\Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位就是床,\x0d\User就是每个Schema的主人,(所以Schema包含的是Object,而不是User),其实User是对应与数据库的(即User是每个对应\x0d\数据库的主人),既然有 *** 作数据库(仓库)的权利,就肯定有 *** 作数据库中每个Schema(房间)的权利,就是说每个数据库映射的User有每个\x0d\Schema(房间)的钥匙,换句话说,如果他是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是他的(包括房间),他有完全的 *** 作权,可以\x0d\扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,呵呵,和现实也太相似了吧。我还可以给User分配具体的权限,也就是他到某一个房间\x0d\能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控制权(R/W),这个就要看这个User所对应的角色Role了,至于分配权\x0d\限的问题,我留在以后单独的blog中详述。比喻到这里,相信大家都清楚了吧。\x0d\\x0d\在SQLServer2000中,假如我们在某一个数据库中创建了用户Bosco,按么此时后台也为我们默认地创建了默认SchemaBosco。Schema的名字和User的名字相同,这也是我们分不清楚用户和Schema的原因。\x0d\\x0d\\x0d\在SQLServer2005中,为了向后兼容,当你用sp_adduser存储过程创建一个用户的时候,SQL\x0d\Server2005同时也创建了一个和用户名相同的Schema,然而这个存储过程是为了向后兼容才保留的,我们应该逐渐熟悉用新的DDL语言\x0d\CreateUser和CreateSchema来 *** 作数据库。在SQLServer2005中,当我们用Create\x0d\User创建数据库用户时,我们可以为该用户指定一个已经存在的Schema作为默认Schema,如果我们不指定,则该用户所默认的Schema即为\x0d\dboSchema,dbo\x0d\房间(Schema)好比一个大的公共房间,在当前登录用户没有默认Schema的前提下,如果你在大仓库中进行一些 *** 作,比如Create\x0d\Tabe,如果没有指定特定的房间(Schema),那么你的物品就只好放进公共的dbo房间(Schema)了。但是如果当前登录用户有默认的\x0d\Schema,那么所做的一切 *** 作都是在默认Schema上进行(比如当前登录用户为login1,该用户的默认Schema为login1,那么所做的\x0d\所有 *** 作都是在这个login1默认Schema上进行的。实验已经证明的确如此)。估计此时你会有一点晕,为什么呢?我刚才说dbo是一个\x0d\Schema,但是你可以在数据库中查看到,dbo同时也是一个user,晕了吧,呵呵。\x0d\\x0d\在SQLServer2005中创建一个数据库的时候,会有一些Schema包括进去,被包括进去的Schema有:dbo,INFORMATION_SCHEMA,guest,sys等等(还有一些角色Schema,不提了,有晕了)。\x0d\\x0d\\x0d\我在上文中已经提到了,在SQLServer2005中当用存储过程sp_adduser创建一个user时,同时SQL\x0d\Server2005也为我们创建了一个默认的和用户名相同的Schema,这个时候问题出来了,当我们createtable\x0d\A时,如果没有特定的Schema做前缀,这个A表创建在了哪个Schema上,即进入了哪个房间?答案是:\x0d\\x0d\1如果当前 *** 作数据库的用户(可以用Selectcurrent_user查出来)有默认的Schema(在创建用户的时候指定了),那么表A被创建在了默认的Schema上。\x0d\\x0d\\x0d\2如果当前 *** 作数据库的用户没有默认的Schema(即在创建User的时候默认为空),但是有一个和用户名同名的Schema,那么表A照样被创建\x0d\在了dbo\x0d\Schema上,即使有一个和用户名同名的Schema存在,由于它不是该用户默认的Schema,所以创建表的时候是不会考虑的,当作一般的\x0d\Schema来处理,别看名字相同,可是没有任何关系哦。\x0d\\x0d\3如果在创建表A的时候指定了特定的Schema做前缀,则表A被创建在了指定的Schema上(有权限吗?)\x0d\\x0d\\x0d\现在问题又出来了,在当前 *** 作数据库的用户(用select\x0d\current_user可以查看到,再次强调)没有默认Schema的前提下,当我们用CreatetableA语句时,A表会去寻找dbo\x0d\Schema,并试图创建在dboSchema上,但是如果创建A表的用户只有对dbo\x0d\Schema的只读权限,而没有写的权限呢?这个时候A表既不是建立不成功,这个就是我以后会提及到的Login,User,\x0d\Role和Schema四者之间的关系。在这里,为了避免混淆和提高 *** 作数据库的速度(在少量数据范围内,对我们肉眼来说几乎看不到差异),我们最好每次\x0d\在 *** 作数据库对象的时候都显式地指定特定的Schema最为前缀。\x0d\\x0d\现在如果登录的用户为Sue,该用户有一个默认Schema也为Sue,那么如果现在有一条查询语句为Selectfrommytable,那么搜寻每个房间(Schema)的顺序是怎样的呢?顺序如下:\x0d\\x0d\1首先搜寻sysmytable(SysSchema)\x0d\\x0d\2然后搜寻Suemytable(DefaultSchema)\x0d\\x0d\3最后搜寻dbomytable(DboSchema)\x0d\\x0d\执行的顺序大家既然清楚了,那么以后在查询数据库表中的数据时,最好指定特定的Schema前缀,这样子,数据库就不用去扫描SysSchema了,当然可以提高查询的速度了。\x0d\\x0d\另外需要提示一下的是,每个数据库在创建后,有4个Schema是必须的(删都删不掉),这4个Schema为:dbo,guest,sys和INFORMATION_SCHEMA,其余的Schema都可以删除。

TRIGGERS表提供了关于触发程序的信息。

必须有SUPER权限才能查看该表。

TRIGGER_SCHEMA和TRIGGER_NAME列中分别含有相应数据库的名称以及触发程序的名称,在该数据库中,含有该触发程序。

MySQL 51包含对触发程序的支持。触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。例如,下述语句将创建1个表和1个INSERT触发程序。触发程序将插入表中某一列的值加在一起:

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account

-> FOR EACH ROW SET @sum = @sum + NEWamount;

CREATE TRIGGER语法

CREATE TRIGGER trigger_name trigger_time trigger_event

ON tbl_name FOR EACH ROW trigger_stmt

触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与TEMPORARY表或视图关联起来。

trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

· INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。

· UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。

· DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。

请注意,trigger_event与以表 *** 作方式激活触发程序的SQL语句并不很类似,这点很重要。例如,关于INSERT的BEFORE触发程序不仅能被INSERT语句激活,也能被LOAD DATA语句激活。

可能会造成混淆的例子之一是INSERT INTO ON DUPLICATE UPDATE 语法:BEFORE INSERT触发程序对于每一行将激活,后跟AFTER INSERT触发程序,或BEFORE UPDATE和AFTER UPDATE触发程序,具体情况取决于行上是否有重复键。

对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于某一表,不能有两个BEFORE UPDATE触发程序。但可以有1个BEFORE UPDATE触发程序和1个BEFORE INSERT触发程序,或1个BEFORE UPDATE触发程序和1个AFTER UPDATE触发程序。

DROP TRIGGER语法

DROP TRIGGER [schema_name]trigger_name

舍弃触发程序。方案名称(schema_name)是可选的。如果省略了schema(方案),将从当前方案中舍弃触发程序。

1“SCAN ENDSCAN”命令是当前表中顺序移动记录指针,并对满足指定条件的每条记录执行“SCAN”与“ENDSCAN”之间的命令块。不打开表,自然就谈不上在 表中移动记录指针,并对记录执行命令了。 答案选择B是对的,但题目本身不严谨,因为:在VF,数据库与表是两个概念,表可以是属于某个数据库的“数据库表”,也可以是不属于任何数据库的“自由表”;执行“SCAN ENDSCAN”必须打开的是“表”,而不是“数据库”,例如,根本就不建立数据库,仅对一个当前打开的自由表也可以执行“SCAN ENDSCAN”。这个题目混淆了VF的“数据库”与“表”,应当改为“必须打开某一个表”。“书上的例子没有打开”可能是省略了USE 命令,但在解释命令时一定有“当前表”之类的限定。总之,只能对当前工作区打开的表执行“SCAN ENDSCAN”

2“&”是执行宏替换的命令,它把内存变量和数组元素的内容作原字符串使用,它后面紧接的变量确实只能是字符型,但该变量在执行宏替换时,可以根据给该变量赋值时的书写格式,作为VF支持的各种数据类型使用。例如:执行已知X="134"后,&X 就是 134,&X+478 就是 134+478,两者结果完全一样(此时,虽然 X 本身是字符型变量,它的值是"134",但在执行 &X+478 时,用数值 134 取代 &X,即实际执行的是 134+478,结果是 612;如果写成 X="'134'" 或 X='"134"',则在执行 &X +478 时,用字符串 "134" 取代 &X,即实际执行的是 "134"+478,将发生“ *** 作数类型不匹配”错误,得不到结果;要得到"134478"的结果,两条语句应该是先执行 X="'134'" ,再执行 &X +"478")

X 赋值格式 &X 的数据类型 &X 的等效表达

X="134" 数值型 134

X="'134'" 字符型 '134'

X="{^1999-11-25}" 日期型 {^1999-11-25}

X="T" 逻辑型 T

……

以上就是关于数据库死锁,并发问题全部的内容,包括:数据库死锁,并发问题、数据库的实例组成部分及作用是什么一个oracle数据库可以有多个实例吗、老人去世1个月核酸报告仍在更新,回应混淆了,如何防止此类现象再次发生等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9466375.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存