临沂网站建设网站推广,网站建设结构分布,站外推广渠道有哪些,上蔡县住房和城乡建设局网站目录
1、数据库中常用的锁类型
2、常见的数据库
3、以MySQL为例
3.1 MySQL的事务
3.2 MySQL事务的四大特性
1. 原子性#xff08;Atomicity#xff09;
2. 一致性#xff08;Consistency#xff09;
3. 隔离性#xff08;Isolation#xff09;
⭐mysql中的事务隔…目录
1、数据库中常用的锁类型
2、常见的数据库
3、以MySQL为例
3.1 MySQL的事务
3.2 MySQL事务的四大特性
1. 原子性Atomicity
2. 一致性Consistency
3. 隔离性Isolation
⭐mysql中的事务隔离级别
脏读、不可重复读和幻读
⭐mysql针对幻读的解决方案
4. 持久性Durability 1、数据库中常用的锁类型
在数据库中常用的锁有以下几种类型 1. 共享锁Shared Lock也称为读锁。多个事务可以同时持有共享锁并且彼此之间不会相互阻塞。共享锁适用于读取操作多个事务可以同时读取同一个数据保证数据的一致性但不允许其他事务对该数据进行修改。 2. 排他锁Exclusive Lock也称为写锁。排他锁只允许一个事务持有其他事务无法同时持有排他锁。排他锁适用于写入和修改操作当一个事务持有排他锁时其他事务无法读取或修改相同的数据确保数据的完整性。 3. 行级锁Row-Level Lock行级锁是在数据库表的行级别上进行加锁只锁定需要操作的行而不是整个表。行级锁可以更细粒度地控制并发访问提高并发性能。常见的行级锁有行共享锁和行排他锁。 4. 间隙锁Gap Lock间隙锁用于防止幻读Phantom Read问题的发生。幻读是指在一个事务中前后两次查询同一个范围的数据时中间可能有其他事务插入了新的数据导致两次查询的结果不一致。间隙锁会锁定一个范围包括范围内的数据和范围之间的间隙阻止其他事务在该范围内插入新的数据。 5. 自旋锁Spin Lock自旋锁是基于乐观锁的一种实现方式它采用忙等待的方式不断尝试获取锁而不是将线程挂起。自旋锁适用于短时间内竞争激烈的情况可以减少线程切换带来的开销。 6. 悲观锁Pessimistic Lock悲观锁认为并发访问会导致冲突所以在访问数据之前就对其进行加锁。悲观锁适用于长时间占用资源或者数据冲突较多的场景但在高并发环境下可能会导致性能问题。 7. 乐观锁Optimistic Lock乐观锁认为并发访问不会导致冲突只在提交更新时检查是否有其他事务修改了数据。如果有冲突则回滚当前事务并重试。乐观锁适用于并发冲突较少的场景可以提高并发性能。 需要根据实际场景和需求选择合适的锁机制并结合数据库事务来保证数据的一致性和并发性。 2、常见的数据库
除了 MySQL还有一些其他常见的数据库系统包括
1. Oracle Database由 Oracle 公司开发的关系型数据库管理系统RDBMS。它是市场上最为流行和强大的商业数据库之一适用于大规模企业级应用。
2. Microsoft SQL Server由 Microsoft 公司开发的关系型数据库管理系统。它广泛应用于 Windows 环境下的企业级应用提供了丰富的功能和工具支持。
3. PostgreSQL一个开源的关系型数据库管理系统以其可靠性、扩展性和兼容性而闻名。它支持复杂的数据类型、高级查询和事务处理并有着活跃的社区支持。
4. MongoDB一个面向文档的 NoSQL 数据库系统以其灵活的数据模型和可扩展性而受到青睐。它支持动态模式和分布式架构适用于大数据存储和处理。
5. Redis一个开源的内存数据库以其高性能的键值存储和丰富的数据结构支持而著名。Redis 可用作缓存、消息队列、会话存储等多种用途。
6. SQLite一个嵌入式关系型数据库引擎非常轻量级且易于使用。它适用于移动设备和小型应用程序不需要独立的服务器进程。
7. IBM Db2由 IBM 公司开发的关系型数据库管理系统适用于大型企业级应用。它提供了高可用性、安全性和扩展性等特性。
这些是其中一些常见的数据库系统每个数据库都有自己的特点和适用场景。选择适合自己需求的数据库可以根据项目规模、性能要求、数据模型等方面进行评估和比较。 3、以MySQL为例
3.1 MySQL的事务
在 MySQL 中事务表示一组数据库操作这些操作要么全部成功执行要么全部失败回滚。事务的概念是为了维护数据的一致性和完整性。当一系列操作需要作为一个不可分割的单元执行时就可以使用事务来确保这一系列操作要么全部成功提交要么全部失败回滚。
在 MySQL 中使用以下语句来定义一个事务
START TRANSACTION; -- 开始事务
-- SQL 操作语句
COMMIT; -- 提交事务
-- 或 ROLLBACK; -- 回滚事务在上述示例中START TRANSACTION 用于开始一个事务后续的 SQL 操作语句都属于这个事务。如果所有操作都成功完成可以使用 COMMIT 提交事务如果出现错误或者需要撤销操作可以使用 ROLLBACK 回滚事务。
举个例子假设我们有一个银行账户表其中包含了用户的存款余额。我们需要进行转账操作从一个账户向另一个账户转移一定金额而这个转账操作需要保证原子性即要么成功转账要么不转账。这就是典型的事务应用场景。
START TRANSACTION;
UPDATE accounts SET balance balance - 100 WHERE account_id 12345; -- 从账户12345中扣除100元
UPDATE accounts SET balance balance 100 WHERE account_id 67890; -- 向账户67890中增加100元
COMMIT; -- 提交事务在这个例子中两个更新操作被组合在一个事务中要么两个更新操作都执行成功要么都不执行。如果在执行过程中出现任何错误可以使用 ROLLBACK 回滚事务以确保数据的完整性和一致性。
通过事务可以确保一组关联的数据库操作要么全部成功执行要么全部不执行从而保证了数据的完整性和一致性。 3.2 MySQL事务的四大特性
MySQL事务具有ACID四大特性即
1. 原子性Atomicity
事务被视为一个不可分割的原子操作单元要么全部执行成功要么全部回滚。如果事务中的任何一部分操作失败那么整个事务将被回滚到初始状态不会留下部分执行的结果。
2. 一致性Consistency
事务在执行之前和执行之后数据库的完整性约束没有被破坏。这意味着事务必须将数据库从一个一致状态转移到另一个一致状态保持数据的合法性和一致性。
3. 隔离性Isolation
事务的执行是相互隔离的即一个事务的执行不应该对其他并发事务产生影响。每个事务都应该感觉到它是在独立运行的不受其他事务的干扰。这可以防止并发事务产生的问题如脏读、不可重复读和幻读。
⭐mysql中的事务隔离级别
在 MySQL 中定义了多个事务隔离级别用于控制并发事务的隔离程度。MySQL 支持以下四种标准的事务隔离级别 读未提交Read Uncommitted事务中的修改即使未提交其他事务也可以读取到这些未提交的数据。这种隔离级别存在脏读、不可重复读和幻读的问题。 读已提交Read Committed只能读取到已经提交的数据未提交的数据对其他事务是不可见的。这种隔离级别可以避免脏读但仍可能出现不可重复读和幻读。 可重复读Repeatable Read——默认保证在同一个事务中多次读取相同记录的结果是一致的。其他事务对于同一条记录的修改在当前事务中是不可见的可以避免脏读和不可重复读但仍可能出现幻读。 可串行化Serializable最高的隔离级别通过强制事务串行执行来避免不可重复读和幻读。在这个级别下所有事务按顺序执行可以避免所有类型的并发问题但会降低并发性能。 可以通过以下语句设置事务的隔离级别
SET TRANSACTION ISOLATION LEVEL isolation_level;
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;其中 isolation_level 可以是 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 或 SERIALIZABLE。
选择合适的事务隔离级别需要根据具体的业务需求和并发访问情况进行权衡以确保既能保证数据的一致性又能提供良好的并发性能。
脏读、不可重复读和幻读
脏读、不可重复读和幻读是数据库中常见的并发问题。 脏读脏读是指一个事务读取到了另一个事务未提交的数据。例如事务A修改了一条记录但还没有提交此时事务B读取了这条记录得到了被修改后的结果但随后事务A回滚了操作导致事务B读取到的数据实际上是无效的。脏读会导致数据的不一致性因此需要避免。 不可重复读不可重复读是指一个事务在两次读取同一条记录期间另一个事务修改了该记录导致前一个事务读取到的数据不一致。例如事务A读取了一条记录然后事务B修改了该记录并提交了此时事务A再次读取同一条记录得到的结果和之前不同。不可重复读会导致数据的不一致性也需要避免。 幻读幻读是指一个事务在两次查询同一范围内的记录期间另一个事务插入了符合条件的记录导致前一个事务得到的结果集不一致。例如事务A查询某个表中所有age大于等于18的记录得到结果集S1但在事务A执行完毕后事务B插入了一条age为20的记录此时事务A再次查询同一范围内的记录得到的结果集S2和S1不同。幻读会导致数据的不一致性同样需要避免。 ⭐mysql针对幻读的解决方案
MySQL 中针对幻读问题的解决方案是使用锁或多版本并发控制MVCC。 1. 锁通过加锁来保证事务的隔离性和一致性。在可重复读隔离级别下MySQL 使用行级锁来避免幻读。当一个事务在读取数据时会在读取的记录上设置共享锁S锁其他事务可以同时读取该记录但不能修改。当一个事务要修改数据时会在修改的记录上设置排他锁X锁其他事务无法读取或修改该记录直到持有锁的事务提交或回滚。 next-key 锁包含两部分记录锁行锁、间隙锁。 记录锁是加在索引上的锁间隙锁是加在索引之间的。 原理将当前数据行与上一条数据和下一条数据之间的间隙锁定保证此范围内读取的数据是一致的。 2. 多版本并发控制MVCCMVCC 是一种基于时间戳的并发控制机制。每个事务在执行时都有一个唯一的时间戳读操作只能读取早于当前事务时间戳的数据版本写操作则创建新的数据版本并将其时间戳设为当前事务时间戳。这样可以实现读操作不受写操作的影响从而避免幻读的问题。 即每一行中都冗余了两个字段。一个是行的创建版本一个是行的删除过期版本。版本号随着每次事务的开启自增。事务每次取数据的时候都会取创建版本小于当前事务版本的数据以及过期版本大于当前版本的数据。 在 MySQL 中InnoDB 存储引擎默认使用 MVCC 来解决幻读问题。它通过使用 Undo 日志记录旧版本数据和 Redo 日志记录新版本数据来实现。在可重复读隔离级别下InnoDB 会在每个事务开始时为其分配一个唯一的事务 ID读操作会根据事务 ID 和数据行的版本号来判断是否可见。
需要注意的是使用 MVCC 解决幻读问题只适用于某些场景例如在可重复读隔离级别下通过索引范围扫描查询数据时可以避免幻读。但对于使用了间隙锁的情况或者涉及到大量插入和删除的场景MVCC 并不能完全解决幻读问题可能需要结合其他方法来处理。
4. 持久性Durability
一旦事务提交成功其所做的修改将永久保存在数据库中即使系统发生故障也不会丢失。数据库系统通过将事务日志持久化到磁盘上来实现持久性以便在系统崩溃后可以进行恢复。
这些特性确保了事务的可靠性和一致性使得在并发环境下多个事务可以安全地进行操作。在应用程序中使用事务可以确保一系列数据库操作的完整性以及对数据的正确处理和管理。 参考
数据库锁全集-CSDN博客
MySQL中都有哪些锁 - 知乎
MySQL :: MySQL 8.0 Reference Manual :: 15.7.1 InnoDB Locking
MySQL常见的七种锁详细介绍_51CTO博客_mysql锁表和解锁语句
MySQL锁篇 - 知乎
常见锁类型及其在数据库中的应用 (锁类型 数据库)-数据运维技术