• 事务


    什么是事务

    事务是逻辑上的一组操作,要么都成功,要么都失败

    为什么需要事务

    很多时候一个数据操作,不是一个sql语句就完成的,可能有很多个sql语句,如果部分sql执行成功而部分sql执行失败将导致数据错乱!

    例如转账操作,

    1.从原有账户减去转账金额

    2.给目标账户加上转账金额

    若中间突然断电了或系统崩溃了,钱就不翼而飞了!

    使用事务

    start transaction; --开启事物,在这条语句之后的sql将处在同一事务,并不会立即修改数据库

    commit;--提交事务,让这个事物中的sql立即执行数据的操作,

    rollback;--回滚事务,取消这个事物,这个事物不会对数据库中的数据产生任何影响

    案例:转账过程中发生异常

    #准备数据
    create table account(
        id int primary key auto_increment,
        name varchar(20),
        money double
    );
    insert into account values(1,'赵大儿子',1000);
    insert into account values(2,'刘大牛',1000);
    insert into account values(3,'猪头三',1000);
    insert into account values(4,'王进',1000);
    insert into account values(5,'黄卉',1000);

    #使用事务在mysql使用,正确在执行,再提交。

    回滚

    python事务的体现

    python的pymysql模块中一切代码其实都是在事务的前提下实行的,所以才有commit和rollback的功能。

    import pymysql
    
    conn = pymysql.connect(
        user = "root",
        password = "root",
        database = "day48"
    )
    #创建游标
    cur = conn.cursor(pymysql.cursors.DictCursor)
    
    sql1 = "update account set money = money-100 where id = 2"
    sql2 = "update account set moneys = money +100 where id = 1"
    
    
    try:
        cur.execute(sql1)
        cur.execute(sql2)
        conn.commit()
        print("修改成功")
    except Exception:
        conn.rollback()
        print("修改失败")

    结果:修改失败

     注意:事务的回滚的前提是能捕捉到异常,否则无法决定何时回滚,Python中很简单就实现了,另外mysql中需要使用存储过程才能捕获异常!

    事务的四个特性:

    原子性:

    事务是一组不可分割的单位,要么同时成功,要么同时不成功。

    一致性:

    事务前后的数据完整性应该保持一致,(数据库的完整性:如果数据库在某一个时间点先,所有数据都符合所有约束,则称数据库为完整性的状态)

    隔离性:

    事务的隔离性是多个用户并发访问数据时,一个用户的事务不能被其他的用户的事务所干扰,多个并发事务之间数据要相互隔离

    持久性

    持久性是指一个事务一旦被提交,它对数据的改变就是永久的,接下来即使数据库发生故障也不应该对其有影响。

    事务对用户的隔离级别

    数据库使用者可以控制数据库工作在哪个级别下,就可与防止不同的隔离性问题

    read uncommitted --不做任何隔离,可能脏读,幻读

    read committed----可以防止脏读,不能防止不可重复读,和幻读,

    Repeatable read --可以防止脏读,不可重复读,不能防止幻读

    Serializable--数据库运行在串行化实现,所有问题都没有,就是性能低

    修改隔离级别:

    select @@tx_isolation;--查询当前级别

    set[session|global] transaction isolation level .... ;修改级别

    实例:

    set global transaction isolation level Repeatable read ;

  • 相关阅读:
    C#内建接口:IEquatable泛型
    C#内建接口:IConvertible
    中小企业掀起“减碳潮”,“上云”提高产品绿色竞争力
    开源|优酷动态模板研发体系为分发提效30%
    比心云平台基于阿里云容器服务 ACK 的弹性架构实践
    同为博客,不同风格 ——Hexo另类搭建
    无需修改代码,用 fcapp.run 运行你的 REST 应用
    异步任务处理系统,如何解决业务长耗时、高并发难题?
    阿里云EMAS旗下低代码平台Mobi开放定向内测
    利器解读!Linux 内核调测中最最让开发者头疼的 bug 有解了|龙蜥技术
  • 原文地址:https://www.cnblogs.com/msj513/p/10021960.html
Copyright © 2020-2023  润新知