zoukankan      html  css  js  c++  java
  • MySQL:事务机制

    为什么需要事务处理?

    在执行SQL语句的时候,某些业务要求,一系列操作必须全部执行,而不能仅执行一部分。

    MySQL5.0后引入了事务机制,MySQL支持几种基本的数据库引擎,并非所有引擎都支持事务处理。


    数据写入

    数据直接写入数据文件是非常危险的事,一旦写入过程出错或故障,会产生数据错乱等严重后果。MySQL利用日志来实现间接写入,MySQL共有五种日志,其中redo日志与undo日志与事务有关,日志文件相当于数据文件的一个副本。


    管理事务

    • 对于单条SQL语句,数据库系统自动将其作为一个事务执行
    • 多条SQL语句要想作为一个事务执行,就必须手动管理事务:
    START TRANSACTION;
    SQL 语句
    [COMMIT/ROLLBACK];
    

    事务的属性

    可见,数据库事务具有ACID这4个特性:

    • Atomic:原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;
    • Consistent:一致性,不管任何给定的时间,并发事务有多少,事务必须保证运行结果的一致性;
    • Isolation:隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;
    • Duration:持久性,即事务完成后,对数据库数据的修改被持久化存储。

    事物的隔离级别

    数据库中的事务是并发执行的,由于隔离性会给某些业务场景带来问题,所以需要设置事务的隔离级别来满足业务要求。

    事务的四种隔离级别:

    隔离级别 功能
    read uncommitted 读取未提交数据
    read committed 读取已提交数据
    repeatable read 重复读取(默认隔离级别)
    serializable 序列化执行事务

    业务场景示例:

    # 两个事务同时购票,需要读取事务未提交的临时数据,查看其他事务是否已经选择该票但未提交。
    
    SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    START TRANSACTION;
    SQL 语句
    [COMMIT/ROLLBACK];
    

    # 银行转账业务,只能让当前事务读取其他事务提交后的数据
    
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
    START TRANSACTION;
    SQL 语句
    [COMMIT/ROLLBACK];
    

    # 用户拍下订单后还没付钱,此时涨价了,按照涨价前还是涨价后的价格呢?
    # 其他事务的提交结果不会影响当前事务
    
    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    START TRANSACTION;
    SQL 语句
    [COMMIT/ROLLBACK];
    
  • 相关阅读:
    35美元的树莓派电脑 黑客就偷走了NASA的火星数据
    博客样式保留
    某社交网站XSS小计
    c# WhereIf 扩展
    SQL、Linq、lamda表达式 同一功能不同写法
    tomcat org.apache.coyote.http11.HeadersTooLargeException: 尝试将更多数据写入响应标头,而不是缓冲区中有可用空间。 增加连接器上的maxHttpHeaderSize或将更少的数据写入响应头。
    Maven Dependency Scopes
    为什么mysql中不应该使用utf8编码
    springmvc dispacher中的url-pattern的/和/*区别
    在jsp中java代码中警告Cannot resolve method "XX"
  • 原文地址:https://www.cnblogs.com/bqzzz/p/14423053.html
Copyright © 2011-2022 走看看