数据库事务的概念、并发事务&并发问题、事务的隔离级别

事务

定义:一条或多条sql语句组成一个执行单位,这个执行单元要么都执行,要么都不执行

事务的特点

  • 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
  • 一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态
  • 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离
  • 持久性:一个事务一旦提交,则它对数据库中的数据改变是永久性的

事务的分类

  1. 隐式事务:没有明显的开启和结束,本身就是一条事务,可以自动提交,比如insert、update、 delete语句等

  2. 显示事务:具有明显的开启和结束。具体步骤如下:

    ①开启事务

    1.set autocommit = 0;(设置事务的自动提交功能为禁用)
    2.start transaction;(可以省略)

    ②编写一组sql语句(仅支持增删改查:select、insert、update、delete)

    1.设置回滚点:savepoint 回滚点名;(可写在多条sql语句之间)

    2.编写sql语句;

    ③结束事务(三者需选一)

    commit;(提交事务)
    rollback;(回滚事务)
    rollback to 回滚点名;(回滚到savepoint处)

并发事务

发生条件:多个事务同时操作同一个数据库的相同数据时

并发问题

对于两个事务T1,T2

  • 脏读:T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的
  • 不可重复读:T1读取了一个字段,然后T2更新了这个字段,之后,T1再次读取相同的字段,值就不同了
  • 幻读:T1从一个表中读取了一个字段,然后T2在该表中插入一些新的行。之后,T1再读取同一个表,就会多出来几行

事务的隔离级别

通过设置隔离级别来解决并发问题(对勾代表此种隔离级别下会出现)

事务的隔离级别 脏读 不可重复读 幻读
read uncommitted(读未提交数据)
read committed(读已提交数据)
repeatable read(可重复读)
serializable(串行化)

MySQL默认第三个隔离级别:repeatable read

Oracle默认第二个隔离级别:read committed

查看隔离级别:select @@tx_isolation;

设置隔离级别:set global/session transaction isolation level 隔离级别;

  • session只针对当前连接,global支持整个数据库的所有连接

猜你喜欢

转载自blog.csdn.net/qq_40177015/article/details/115419510