`
yuzhi2217
  • 浏览: 36873 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MySQL中的隔离级别和悲观锁及乐观锁示例

 
阅读更多

MySQL中的隔离级别和悲观锁及乐观锁示例

 

1MySQL的事支持 
MySQL
的事支持不是定在MySQL器本身,而是与存引擎相关:

 

  1. MyISAM:不支持事,用于只程序提高性能   
  2. InnoDB:支持ACID、行级锁、并   
  3. Berkeley DB:支持事  


2
隔离级别
隔离级别决定了一个session中的事可能另一个session的影响、并session数据的操作、一个session中所数据的一致性 
ANSI
准定4个隔离级别MySQLInnoDB都支持:

Java

  1. READ UNCOMMITTED:最低级别的隔离,通常又称dirty read,它允一个事务读commit的数据,这样可能会提高性能,但是dirty read可能不是我想要的   
  2. READ COMMITTED:在一个事中只允commit记录,如果sessionselect查询中,另一sessioninsert一条记录新添加的数据不可   
  3. REPEATABLE READ:在一个事开始后,其他session数据的修改在本事中不可,直到本事commitrollback。在一个事中重复select果一,除非本事update数据   
  4. SERIALIZABLE:最高级别的隔离,只允串行行。了达到此目的,数据住每行已经读取的记录,其他session不能修改数据直到前一事务结束,事commit或取消  

可以使用如下MySQLsession隔离级别

 

[c-sharp] view plaincopy
 
  1. 1.  SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}   

 

 

 

MySQL的隔离级别REPEATABLE READ,在置隔离级别为READ UNCOMMITTEDSERIALIZABLE要小心,READ UNCOMMITTED致数据完整性的问题,而SERIALIZABLE致性能问题并增加死的机率

 

 

3,隔离级别
乐观所和悲观锁策略: 
观锁:在取数据时锁住那几行,其他对这几行的更新需要等到悲观锁结才能继续 
乐观所:取数据,更新时检查是否数据已被更新,如果是取消当前更新 
一般在悲
观锁的等待时间过长而不能接受才会选择乐观锁 
观锁的例子:

 

[c-sharp] view plaincopy
 
  1. CREATE PROCEDURE tfer_funds     
  2.        (from_account INT, to_account INT,tfer_amount NUMERIC(10,2),     
  3.         OUT status INT, OUT message VARCHAR(30))     
  4. BEGIN     
  5.     DECLARE from_account_balance NUMERIC(10,2);     
  6.     
  7.     START TRANSACTION;     
  8.     
  9.     
  10.     SELECT balance     
  11.       INTO from_account_balance     
  12.       FROM account_balance     
  13.      WHERE account_id=from_account     
  14.        FOR UPDATE;     
  15.     
  16.     IF from_account_balance>=tfer_amount THEN     
  17.     
  18.          UPDATE account_balance     
  19.             SET balance=balance-tfer_amount     
  20.           WHERE account_id=from_account;     
  21.     
  22.          UPDATE account_balance     
  23.             SET balance=balance+tfer_amount     
  24.           WHERE account_id=to_account;     
  25.          COMMIT;     
  26.     
  27.          SET status=0;     
  28.          SET message='OK';     
  29.     ELSE     
  30.          ROLLBACK;     
  31.          SET status=-1;     
  32.          SET message='Insufficient funds';     
  33.     END IF;     
  34. END;    

 

 

乐观锁的例子:

 

 

[c-sharp] view plaincopy
 
  1. CREATE PROCEDURE tfer_funds     
  2.     (from_account INT, to_account INT, tfer_amount NUMERIC(10,2),     
  3.         OUT status INT, OUT message VARCHAR(30) )     
  4.     
  5. BEGIN     
  6.     
  7.     DECLARE from_account_balance    NUMERIC(8,2);     
  8.     DECLARE from_account_balance2   NUMERIC(8,2);     
  9.     DECLARE from_account_timestamp1 TIMESTAMP;     
  10.     DECLARE from_account_timestamp2 TIMESTAMP;     
  11.     
  12.     SELECT account_timestamp,balance     
  13.         INTO from_account_timestamp1,from_account_balance     
  14.             FROM account_balance     
  15.             WHERE account_id=from_account;     
  16.     
  17.     IF (from_account_balance>=tfer_amount) THEN     
  18.     
  19.         -- Here we perform some long running validation that     
  20.         -- might take a few minutes */     
  21.         CALL long_running_validation(from_account);     
  22.     
  23.         START TRANSACTION;     
  24.     
  25.         -- Make sure the account row has not been updated since     
  26.         -- our initial check     
  27.         SELECT account_timestamp, balance     
  28.             INTO from_account_timestamp2,from_account_balance2     
  29.             FROM account_balance     
  30.             WHERE account_id=from_account     
  31.             FOR UPDATE;     
  32.     
  33.         IF (from_account_timestamp1 <> from_account_timestamp2 OR     
  34.             from_account_balance    <> from_account_balance2)  THEN     
  35.             ROLLBACK;     
  36.             SET status=-1;     
  37.             SET message=CONCAT("Transaction cancelled due to concurrent update",     
  38.                 " of account"  ,from_account);     
  39.         ELSE     
  40.             UPDATE account_balance     
  41.                 SET balance=balance-tfer_amount     
  42.                 WHERE account_id=from_account;     
  43.     
  44.             UPDATE account_balance     
  45.                 SET balance=balance+tfer_amount     
  46.                 WHERE account_id=to_account;     
  47.     
  48.             COMMIT;     
  49.     
  50.             SET status=0;     
  51.             SET message="OK";     
  52.         END IF;     
  53.     
  54.     ELSE     
  55.         ROLLBACK;     
  56.         SET status=-1;     
  57.         SET message="Insufficient funds";     
  58.     END IF;     
  59. END$$    
分享到:
评论

相关推荐

    Hibernate实现悲观锁和乐观锁代码介绍

    在本文中,我们将详细介绍 Hibernate 实现悲观锁和乐观锁的代码实现,并讨论 Hibernate 的隔离机制和锁机制。 Hibernate 的隔离机制 Hibernate 的隔离机制是基于数据库的事务隔离级别的。 Hibernate 提供了四种...

    基于Django的乐观锁与悲观锁解决订单并发问题详解

    本文将深入探讨如何使用Django框架中的乐观锁和悲观锁机制来解决订单并发问题,确保数据的一致性和准确性。 首先,我们需要了解什么是事务。在数据库管理中,事务是一组操作,这些操作要么全部成功,要么全部失败。...

    2021面试题总结MySQL篇.pdf

    本文档详细介绍了 MySQL 中关于事务隔离级别、幻读、存储引擎及其特性,以及在高并发场景下如何保证数据的安全修改等内容。通过对这些知识点的理解,可以帮助开发者更好地选择合适的隔离级别和存储引擎,优化数据库...

    聊聊高并发高可用那些事(Kafka、Redis、MySQL)

    10. **乐观锁和悲观锁**:乐观锁假设冲突少,读多写少;悲观锁假设冲突多,读写都需要锁定资源。 11. **分库分表**:通过将数据分散到多个数据库或表中,提高系统并发能力。 12. **存储过程与定时任务**:存储过程...

    MySQL大厂面试题甄选,150道mysql数据库高频面试题讲解 MySQL数据库面试题宝典,mysql面试必考!msql工作必

    2. 锁机制:了解行级锁、表级锁、页级锁的区别,以及乐观锁和悲观锁的工作原理。 四、存储过程与触发器 1. 存储过程:理解存储过程的概念,知道如何编写、调用和管理存储过程,以及它们在提升代码复用性和安全性...

    面试中涉及到的mysql锁看完就不愁了

    最后,我们讨论悲观锁和乐观锁。悲观锁在操作数据时立即获取锁,防止其他事务同时修改,适合高冲突环境。乐观锁则假设不会有冲突,操作时不加锁,但在更新时检查数据是否被其他事务修改过。MySQL的InnoDB引擎默认...

    Mysql事务并发问题解决方案

    本篇文章将深入探讨MySQL中的事务并发问题及其解决方案,包括悲观锁和乐观锁的应用。 首先,问题背景是在视频观看记录更新场景中,当用户观看进度达到100%时,后续请求不再更新。然而,由于并发事务处理不当,出现...

    Python在数据库教学中的应用.pdf

    4. 构建加锁机制的示例:Python也可以用于展示数据库中的加锁机制,例如乐观锁和悲观锁的实现方式。学生可以编写相关的代码,了解数据库并发控制中的锁机制,并观察加锁对并发操作的影响。 5. 数据库管理:Python...

    数据库习题答案.zip

    文档可能讲解锁机制、乐观锁和悲观锁,以及死锁的预防和解决。 每个章节的文档(如"ch2.doc"至"ch12.doc")可能分别专注于上述的一个或多个主题,提供深入的理论解释、示例和习题解答,帮助读者全面理解和掌握...

    Hibernate关键知识点大全

    - 悲观锁和乐观锁是并发控制的两种方式,悲观锁假设冲突频繁,乐观锁则在数据修改时检查冲突。 13. **缓存机制** - Hibernate的一级缓存是Session级别的,二级缓存是SessionFactory级别的,它们能提升查询效率。...

    数据库期末复习选填 题知识点

    - **乐观锁/悲观锁**:乐观锁假设冲突少,只在提交时检查;悲观锁则在操作前锁定资源。 这些知识点涵盖了数据库系统概论的重要方面,对于期末复习至关重要。无论是对数据库有一定了解还是完全新手,都可以按照建议...

    data_database_Different_源码.zip

    乐观锁和悲观锁是两种常见的并发控制策略。 9. 分布式数据库:随着大数据和云计算的发展,分布式数据库变得越来越重要。它们通过在多个节点上分片数据来提高可伸缩性和容错性。 10. NoSQL数据库:非关系型数据库...

    数据库原理与应用 课后习题 答案

    常见的并发控制机制有锁定协议(共享锁,排他锁)和乐观锁、悲观锁策略。此外,事务(Transaction)的概念也至关重要,其ACID属性(原子性、一致性、隔离性、持久性)保证了数据库操作的可靠性。 数据库安全性则...

    数据库.zip

    事务处理和锁定机制如乐观锁和悲观锁,用于协调并防止数据不一致。 8. **数据库复制与集群**:数据库复制可以在多个服务器之间同步数据,提供高可用性和故障切换能力。数据库集群则通过将负载分散到多个服务器,...

    PHP通过插入mysql数据来实现多机互锁实例

    在分布式系统中,多机互锁是一种常见的并发控制机制,用于...然而,对于更复杂的分布式环境,可能需要考虑更高级的并发控制技术,如分布式锁服务(如Redis或Zookeeper)或者使用更高级的数据库特性,如乐观锁或悲观锁。

    字段实现关联锁定 .rar

    5. **锁定协议**:例如两阶段锁定(2PL)和多版本并发控制(MVCC),这些协议提供了确保事务隔离级别的规则,防止死锁和数据不一致。 在实际应用中,选择哪种锁定策略取决于系统的并发需求、数据竞争情况以及事务...

    Hibernate全部知识点

    - **乐观锁** 和 **悲观锁** 是两种常用的并发控制机制,分别通过版本号检查和锁定资源的方式来防止并发冲突。 #### 缓存机制 - **一级缓存**(Session级别的缓存)和**二级缓存**(SessionFactory级别的缓存)是...

    银行账户管理系统内含教程.zip

    6. **并发控制**:系统需要处理大量并发请求,可能采用乐观锁或悲观锁策略来避免数据冲突。 7. **报表与统计**:系统可能包含报表生成功能,用于账户余额、交易记录等的统计分析,这可能涉及到报表工具如水晶报表或...

    数据库模拟航空售票

    锁机制、乐观锁或悲观锁策略可以应用于确保数据的一致性。 6. **用户界面**:设计友好的用户界面,使用户能够方便地查询航班、选择座位、购票和退票。这可能涉及HTML、CSS和JavaScript等前端技术。 7. **后端编程*...

Global site tag (gtag.js) - Google Analytics