mysql锁定了数据库表只能写,为什么还可以读

mysql锁定了数据库表只能写,为什么还可以读,第1张

锁的作用,就是把权限归为私有,其它人用不了。你自已把表锁了,自已当然还能用。

1、表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。

2、数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则。

3、对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外。

4、MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。

5、总的来说,MySQL各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表级锁定。下面我们先分析一下MySQL这三种锁定的特点和各自的优劣所在。

#表名,表示该表“#表名整个是一个表名”的是本地临时表。

它们仅对当前的用户连接(也就是创建本地临时表的connection)是可见的;当用户从 SQL Server 断开连接时被删除。

这个表(#表名)是建立在存储在tempdb中的,根据数据库连接独立。只有创建本地临时表的数据库连接有表的访问权限,其它连接不能访问该表。

除了这种本地临时表以外还有一种##表名,这种叫做全局临时表,其他连接是可以查询的,不过在其他链接未持有该全局临时表排他锁的情况下,当建立临时表的连接断开后,该表也就随之消失。

个人理解:

排他分为,乐观排他

悲观排他,就是乐观锁和悲观锁的意思,

乐观与悲观针对的是数据库而言,

乐观排他后,别人也能进行数据修改,但是当你提交时候发现数据被修改了就会报错。

悲观排他后,别人是动不了这些数据的。

共享锁不甚了解

ConnectOracle con = new ConnectOracle();

Connection connect = congetConnection();

// 设置手动提交事务

connectsetAutoCommit(false);

Statement stmt = connectcreateStatement();

// 锁表

stmtaddBatch("lock table t_symbol_code_fee in exclusive mode");

// 此处打上断点后,执行另一个类,你会发现,执行成功后并没有更改记录,因为表已经被锁定。只有提交事务后,TestOracle中执行的修改才能生效。

stmtexecuteBatch();

// 提交后自动解锁,回滚时也会自动解锁

connectcommit();

stmtclose();

connectclose();

事务锁是为了应对并发问题的一种解决机制,在事务获取数据块当前状态的依赖关系(如通过读取或修改数据)之前,它必须保护自己不受其他事务对同一数据进行修改的影响,事务通过请求锁定数据块来达到此目的。

1锁模式如果某个事务已获得特定数据的锁,则其他事务不能获得与该锁模式发生冲突的锁。如果事务请求的锁模式与已授予同一数据的锁发生冲突,则数据库引擎实例将暂停事务请求直到第一个锁被释放。锁有多种模式,包括共享锁、更新锁、排他锁等。

(1)共享锁(S锁)共享锁允许并发事务在封闭式并发事务下读取资源。有关详细信息,请参阅“213并发事务”的类型。资源上存在共享锁时,任何其他事务都不能修改数据。读取 *** 作一完成,就立即释放资源上的共享锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务持续时间内用锁定提示保留共享锁。

2)更新锁(U锁)更新锁是共享锁和排他锁的混合型锁,更新锁意味着在做一个更新时,一个共享锁在扫描完成符合条件的数据后可能会转化成排他锁。这里面有两个步骤:((1)扫描获取Where条件时,这部分是一个更新查询,此时是一个更新锁。

(2)如果将执行写入更新,此时该锁升级到排他锁;否则,该锁转变成共享锁。

3)排他锁(X锁)排他锁可以防止并发事务对资源进行访问,不与其他任何锁兼容。使用排他锁时,任何其他事务都无法修改数据;仅在未提交读隔离级别时才会被其他事务读取占有的数据资源。

2死锁死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者彼此通信而造成的一种阻塞的现象,若无外力作用,它们将无法推进下去,此时称系统处于死锁状态或系统产生了死锁。这些永远在互相等待的进程称为死锁进程。下面从死锁产生的原因、条件及预防措施等方面来研究事务的死锁。

(1)死锁产生的原因当两个或多个进程各自具有某个资源的锁定,但其他进程尝试要锁定此资源,而造成进程永久封锁彼此时,会发生死锁。例如,事务A取得数据列1的排他锁定,事务B取得数据列2的排他锁定,事务A现在要求取得数据列2的独占锁定,事务B现在要求取得数据列1的独占锁定。事务A与事务B均需要独占数据列1与数据列2的资源,但两个资源分别被两个事务各占一个,互相等待对方的占据的资源才能完成本身的事务,就会造成事务间进程的死锁。

2)死锁产生的条件虽然进程在运行过程中可能发生死锁,但死锁的发生也必须具备一定的条件。死锁的发生必须具备以下四个必要条件。

((1)互斥条件。互斥条件指进程对所分配到的资源进行排他性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其他进程请求资源,则请求者只能等待,直至占有资源的进程用完释放。

(2)请求和保持条件。请求和保持条件指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但又对自己已获得的其他资源保持不放。

(3)不剥夺条件。不剥夺条件指进程已获得的资源在未使用完之前不能被剥夺,只能在使用完时由自己释放。

(4)环路等待条件。环路等待条件指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,…,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源;…;Pn正在等待已被P0占用的资源。死锁的预防措施理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。只要打破四个必要条件之一就能有效预防死锁的发生。

((1)打破互斥条件。改造独占性资源为虚拟资源,但大部分资源已无法改造。

(2)打破不可抢占条件。当一进程占有一独占性资源后又去申请另一独占性资源而无法满足时,则退出原占有的资源。

(3)打破占有且申请条件。采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不满足就等待,这样就不会出现占有部分资源后再去申请其他资源的场景。

(4)打破循环等待条件。实现资源有序分配策略,对所有设备实现分类编号,所有进程只能采用按序号递增的形式申请资源。

所以,在系统设计、进程调度等方面要注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源,在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配;否则予以分配。因此,对资源的分配要给予合理的规划。

以上就是关于mysql锁定了数据库表只能写,为什么还可以读全部的内容,包括:mysql锁定了数据库表只能写,为什么还可以读、sqlserver中表名前面加一个#号是什么意思、如何在oracle中使用排他锁等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/sjk/9275406.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存