MySQL中的隔离级别和悲观锁及乐观锁示例
1,MySQL的事务支持
MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关:
- MyISAM:不支持事务,用于只读程序提高性能
- InnoDB:支持ACID事务、行级锁、并发
- Berkeley DB:支持事务
2,隔离级别
隔离级别决定了一个session中的事务可能对另一个session的影响、并发session对数据库的操作、一个session中所见数据的一致性
ANSI标准定义了4个隔离级别,MySQL的InnoDB都支持:
Java代码
- READ UNCOMMITTED:最低级别的隔离,通常又称为dirty read,它允许一个事务读取还没commit的数据,这样可能会提高性能,但是dirty read可能不是我们想要的
- READ COMMITTED:在一个事务中只允许已经commit的记录可见,如果session中select还在查询中,另一session此时insert一条记录,则新添加的数据不可见
- REPEATABLE READ:在一个事务开始后,其他session对数据库的修改在本事务中不可见,直到本事务commit或rollback。在一个事务中重复select的结果一样,除非本事务中update数据库。
- SERIALIZABLE:最高级别的隔离,只允许事务串行执行。为了达到此目的,数据库会锁住每行已经读取的记录,其他session不能修改数据直到前一事务结束,事务commit或取消时才释放锁。
可以使用如下语句设置MySQL的session隔离级别:
- 1. SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
MySQL默认的隔离级别是REPEATABLE READ,在设置隔离级别为READ UNCOMMITTED或SERIALIZABLE时要小心,READ UNCOMMITTED会导致数据完整性的严重问题,而SERIALIZABLE会导致性能问题并增加死锁的机率
3,隔离级别
乐观所和悲观锁策略:
悲观锁:在读取数据时锁住那几行,其他对这几行的更新需要等到悲观锁结束时才能继续
乐观所:读取数据时不锁,更新时检查是否数据已经被更新过,如果是则取消当前更新
一般在悲观锁的等待时间过长而不能接受时我们才会选择乐观锁
悲观锁的例子:
- CREATE PROCEDURE tfer_funds
- (from_account INT, to_account INT,tfer_amount NUMERIC(10,2),
- OUT status INT, OUT message VARCHAR(30))
- BEGIN
- DECLARE from_account_balance NUMERIC(10,2);
- START TRANSACTION;
- SELECT balance
- INTO from_account_balance
- FROM account_balance
- WHERE account_id=from_account
- FOR UPDATE;
- IF from_account_balance>=tfer_amount THEN
- UPDATE account_balance
- SET balance=balance-tfer_amount
- WHERE account_id=from_account;
- UPDATE account_balance
- SET balance=balance+tfer_amount
- WHERE account_id=to_account;
- COMMIT;
- SET status=0;
- SET message='OK';
- ELSE
- ROLLBACK;
- SET status=-1;
- SET message='Insufficient funds';
- END IF;
- END;
乐观锁的例子:
- CREATE PROCEDURE tfer_funds
- (from_account INT, to_account INT, tfer_amount NUMERIC(10,2),
- OUT status INT, OUT message VARCHAR(30) )
- BEGIN
- DECLARE from_account_balance NUMERIC(8,2);
- DECLARE from_account_balance2 NUMERIC(8,2);
- DECLARE from_account_timestamp1 TIMESTAMP;
- DECLARE from_account_timestamp2 TIMESTAMP;
- SELECT account_timestamp,balance
- INTO from_account_timestamp1,from_account_balance
- FROM account_balance
- WHERE account_id=from_account;
- IF (from_account_balance>=tfer_amount) THEN
- -- Here we perform some long running validation that
- -- might take a few minutes */
- CALL long_running_validation(from_account);
- START TRANSACTION;
- -- Make sure the account row has not been updated since
- -- our initial check
- SELECT account_timestamp, balance
- INTO from_account_timestamp2,from_account_balance2
- FROM account_balance
- WHERE account_id=from_account
- FOR UPDATE;
- IF (from_account_timestamp1 <> from_account_timestamp2 OR
- from_account_balance <> from_account_balance2) THEN
- ROLLBACK;
- SET status=-1;
- SET message=CONCAT("Transaction cancelled due to concurrent update",
- " of account" ,from_account);
- ELSE
- UPDATE account_balance
- SET balance=balance-tfer_amount
- WHERE account_id=from_account;
- UPDATE account_balance
- SET balance=balance+tfer_amount
- WHERE account_id=to_account;
- COMMIT;
- SET status=0;
- SET message="OK";
- END IF;
- ELSE
- ROLLBACK;
- SET status=-1;
- SET message="Insufficient funds";
- END IF;
- END$$
相关推荐
在本文中,我们将详细介绍 Hibernate 实现悲观锁和乐观锁的代码实现,并讨论 Hibernate 的隔离机制和锁机制。 Hibernate 的隔离机制 Hibernate 的隔离机制是基于数据库的事务隔离级别的。 Hibernate 提供了四种...
本文将深入探讨如何使用Django框架中的乐观锁和悲观锁机制来解决订单并发问题,确保数据的一致性和准确性。 首先,我们需要了解什么是事务。在数据库管理中,事务是一组操作,这些操作要么全部成功,要么全部失败。...
本文档详细介绍了 MySQL 中关于事务隔离级别、幻读、存储引擎及其特性,以及在高并发场景下如何保证数据的安全修改等内容。通过对这些知识点的理解,可以帮助开发者更好地选择合适的隔离级别和存储引擎,优化数据库...
10. **乐观锁和悲观锁**:乐观锁假设冲突少,读多写少;悲观锁假设冲突多,读写都需要锁定资源。 11. **分库分表**:通过将数据分散到多个数据库或表中,提高系统并发能力。 12. **存储过程与定时任务**:存储过程...
2. 锁机制:了解行级锁、表级锁、页级锁的区别,以及乐观锁和悲观锁的工作原理。 四、存储过程与触发器 1. 存储过程:理解存储过程的概念,知道如何编写、调用和管理存储过程,以及它们在提升代码复用性和安全性...
最后,我们讨论悲观锁和乐观锁。悲观锁在操作数据时立即获取锁,防止其他事务同时修改,适合高冲突环境。乐观锁则假设不会有冲突,操作时不加锁,但在更新时检查数据是否被其他事务修改过。MySQL的InnoDB引擎默认...
本篇文章将深入探讨MySQL中的事务并发问题及其解决方案,包括悲观锁和乐观锁的应用。 首先,问题背景是在视频观看记录更新场景中,当用户观看进度达到100%时,后续请求不再更新。然而,由于并发事务处理不当,出现...
4. 构建加锁机制的示例:Python也可以用于展示数据库中的加锁机制,例如乐观锁和悲观锁的实现方式。学生可以编写相关的代码,了解数据库并发控制中的锁机制,并观察加锁对并发操作的影响。 5. 数据库管理:Python...
文档可能讲解锁机制、乐观锁和悲观锁,以及死锁的预防和解决。 每个章节的文档(如"ch2.doc"至"ch12.doc")可能分别专注于上述的一个或多个主题,提供深入的理论解释、示例和习题解答,帮助读者全面理解和掌握...
- 悲观锁和乐观锁是并发控制的两种方式,悲观锁假设冲突频繁,乐观锁则在数据修改时检查冲突。 13. **缓存机制** - Hibernate的一级缓存是Session级别的,二级缓存是SessionFactory级别的,它们能提升查询效率。...
- **乐观锁/悲观锁**:乐观锁假设冲突少,只在提交时检查;悲观锁则在操作前锁定资源。 这些知识点涵盖了数据库系统概论的重要方面,对于期末复习至关重要。无论是对数据库有一定了解还是完全新手,都可以按照建议...
乐观锁和悲观锁是两种常见的并发控制策略。 9. 分布式数据库:随着大数据和云计算的发展,分布式数据库变得越来越重要。它们通过在多个节点上分片数据来提高可伸缩性和容错性。 10. NoSQL数据库:非关系型数据库...
常见的并发控制机制有锁定协议(共享锁,排他锁)和乐观锁、悲观锁策略。此外,事务(Transaction)的概念也至关重要,其ACID属性(原子性、一致性、隔离性、持久性)保证了数据库操作的可靠性。 数据库安全性则...
事务处理和锁定机制如乐观锁和悲观锁,用于协调并防止数据不一致。 8. **数据库复制与集群**:数据库复制可以在多个服务器之间同步数据,提供高可用性和故障切换能力。数据库集群则通过将负载分散到多个服务器,...
在分布式系统中,多机互锁是一种常见的并发控制机制,用于...然而,对于更复杂的分布式环境,可能需要考虑更高级的并发控制技术,如分布式锁服务(如Redis或Zookeeper)或者使用更高级的数据库特性,如乐观锁或悲观锁。
5. **锁定协议**:例如两阶段锁定(2PL)和多版本并发控制(MVCC),这些协议提供了确保事务隔离级别的规则,防止死锁和数据不一致。 在实际应用中,选择哪种锁定策略取决于系统的并发需求、数据竞争情况以及事务...
- **乐观锁** 和 **悲观锁** 是两种常用的并发控制机制,分别通过版本号检查和锁定资源的方式来防止并发冲突。 #### 缓存机制 - **一级缓存**(Session级别的缓存)和**二级缓存**(SessionFactory级别的缓存)是...
6. **并发控制**:系统需要处理大量并发请求,可能采用乐观锁或悲观锁策略来避免数据冲突。 7. **报表与统计**:系统可能包含报表生成功能,用于账户余额、交易记录等的统计分析,这可能涉及到报表工具如水晶报表或...
锁机制、乐观锁或悲观锁策略可以应用于确保数据的一致性。 6. **用户界面**:设计友好的用户界面,使用户能够方便地查询航班、选择座位、购票和退票。这可能涉及HTML、CSS和JavaScript等前端技术。 7. **后端编程*...