最牛的网站建设c#网站开发模板
web/
2025/9/29 1:15:53/
文章来源:
最牛的网站建设,c#网站开发模板,辽阳企业网站建设费用,asp 通过ftp 网站搬家文章目录 数据库的隔离级别和锁机制一、数据库隔离级别1. 隔离级别说明2. 如何选择隔离级别3. 查询当前客户端隔离级别的命令.4. 修改隔离的命令 二、数据库中的锁1. 共享锁、排他锁2. 死锁3. 行级锁、表级锁 三、解决更新丢失问题1. 解决方案2. 乐观锁、悲观锁3. 乐观锁、悲观… 文章目录 数据库的隔离级别和锁机制一、数据库隔离级别1. 隔离级别说明2. 如何选择隔离级别3. 查询当前客户端隔离级别的命令.4. 修改隔离的命令 二、数据库中的锁1. 共享锁、排他锁2. 死锁3. 行级锁、表级锁 三、解决更新丢失问题1. 解决方案2. 乐观锁、悲观锁3. 乐观锁、悲观锁的选择 数据库的隔离级别和锁机制
一、数据库隔离级别
1. 隔离级别说明
隔离级别是基于客户端来讨论的不同的客户端在和服务器交互式可以有不同的隔离级别客户端处在什么隔离级别就具有什么隔离级别的问题。mysql数据库的隔离级别一共有四种.
标志名称说明read uncommitted读未提交不做任何隔离。可能产生脏读,不可重复读,虚读/幻读问题性能最好。read committed读已提交一个事务可以读取到另一个事务已经提交的数据。可以防止脏读但可能存在不可重复读,虚读/幻读问题,性能较好。repeatable read可重复读取在查询整表数据时一个事务可以读取到另一个事务已经提交的数据。可以防止脏读不可重复读问题但可能存在虚读/幻读问题。mysql默认采用此隔离级别。性能一般。serializable序列化通过锁进行严格隔离对同一个数据的访问要串行化进行。可以防止脏读不可重复读虚读/幻读问题。但数据库处于串行化状态效率极其低下。性能最差。
2. 如何选择隔离级别
1. 选择不同的隔离级别就可以防止在并发读写的过程中的不同的隔离性问题隔离级别设置的越严格防止的问题就越多但性能就越低隔离级别设置的越宽松性能就越好但可能产生的隔离性问题就越多
2. 数据库使用者应该根据自己的需求选择一个合理的隔离级别选择一个能够防止想要防止的问题的情况下性能尽量好的隔离级别。
3. 从可靠性角度:serializable repeatable read - read committed - read uncommitted
4. 从性能角度:read uncommitted - read committed - repeatable read -serializable
5. 在真正的开发中 脏读问题太严重所以read uncommitted很少用。serializable性能太差也很少用。所以只需根据是否需要防止不可重复读在read committed 和repeatable read之间选择一个即可。在实际开发中 repeatable read用的跟多一些。3. 查询当前客户端隔离级别的命令.
select tx isolation;4. 修改隔离的命令
set[session/global] transaction isolation level 隔离级别名称;1. 可以通过选择[session]来指定修改的是当前客户端的隔离级别mysql服务器默认的隔离级别不变。
2. 可以通过选择[global来指定修改的是mysl服务器默认的隔离级别当前客户端隔离级别不变默认不写就是[global)二、数据库中的锁
1. 共享锁、排他锁
数据库也是用锁来保证数据隔离的但是为了数据库的锁设计的更加精细。体现在数据库中的锁分为共享锁和排他锁
1. 共享锁和共享锁可以共存共享锁和排他锁不能共存
2. 排他锁和任何锁都不能共存
3. 在非serializable隔离级别下查询不加锁
4. 在Serializable隔离级别下查询加共享锁。
5. 任意隔离级别下增删改加排他锁。正是利用了这种锁机制数据库保证了并发的读不隔离并发的写一定隔离并发的读写在某一方或多方为Serializable的级别时实现串行化保证完全可靠。
2. 死锁
多个客户端都是serializable的级别下先查询再修改可能会进入与相等待状态其实就是发生了死锁mysql会检测到死锁自动退出一方以打断死锁。
3. 行级锁、表级锁
数据库的锁根据锁定的粒度可以分为行级锁和表级锁。行级锁锁一行。表级锁锁整表。数据库自动根据操作的数据决定加哪种粒度的
三、解决更新丢失问题
1. 解决方案
1. 修改隔离级别为Serializablea。将数据库的隔离级别设置为Serializable即可完全防止更新丢失问题但通常基于效率的考虑数据库的隔离级别不会设置为Serializable.此时要选择其他的解决方案
2. 悲观锁、乐观锁。在非Serializable隔离级别下可以使用悲观锁、乐观锁来解决更新丢失。悲观锁、乐观锁并不是数据库中真正存在的锁仅仅是更新丢失问题解决方案的名字。这个名字体现了在解决更新丢失问题时的思考的角度。2. 乐观锁、悲观锁
1. 悲观锁悲观的认为每次查询都会造成更新丢失则在查询时手动加上排他锁从而在查询阶段就避免同时查询从而避免更新丢失。在select语句后加上for update就可以手动增加排他锁。
2. 乐观锁乐观的认为每次查询都不会造成更新丢失每次都正常执行查询但为了防止可能的更新丢失造成危害通常都会在表中额外设计一个额外版本字段每次更新时版本字段都自增且每次更新操作中必须基于上一个版本才做更新从而避免更新丢失造成的危害。3. 乐观锁、悲观锁的选择
1. 悲观锁的缺点是一查就锁查询多是效率低下
2. 乐观锁的缺点是在大量的并发修改时很容易造成修改失败极端的情况下可能需要失败很多次才能完成修改,
3. 查询较多修改较少用乐观锁
4. 修改较多查询较少用悲观锁
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83622.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!