My SQL中事务那点事

1.定义

也称工作单元,是由一个或多个SQL语句所组成的操作序列,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。在数据库中,通过事务来保证数据的一致性。

2.操作

  1. 开启事务: start transaction;
  2. 回滚:rollback;
  3. 提交:commit;

3.提交方式

  1. 自动提交
    当我们进行DML(增删改)操作后,mysql默认进行自动提交,我们无需commit;来提交。
  2. 手动提交
    这需要我们先开启事务后(START TRANSACTION;),然后执行SQL语句,最后进行提交(commit;)。

    可以查看事务的提交方式:SELECT @@autocommit;
    设置事务手动提交方式:set @@autocommit = 0;
    默认自动提交:@@autocommit = 1;

4.事务特征(ACID)

  1. 原子性(Atomicity)
    事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况。
  2. 一致性(Consistency)
    事务使得系统从一个一致的状态转换到另一个一致状态,不论事务的成功还是失败,整个系统处于数据一致的状态。
  3. 隔离性(Isolation)
    一个事务的执行不会被另一个事务所干扰。比如两个人同时从一个账户从取钱,通过事务的隔离性确保账户余额的正确性。
  4. 持久性(Durability)
    也称为永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚。

5.事务的隔离级别

5.1 定义

多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。

5.2 产生问题

  1. 脏读

    一个事务,读取到另一个事务中没有提交的数据

  2. 不可重复读

    在同一个事务中,两次读取到的数据不一样
    简单来说:
    两个事务都进行了开启,事务①首先进行了select,读出一些数据,然后事务②进行DML操作,已提交,这时事务①再次进行select数据,发现在事务①中,两次提交的数据不一致。

  3. 幻读

    由于mysql不能进行操作实现,大家可能对其理解为两次读取获取的结果集不同,其实更加侧重某一次的的select查询得到的结果无法支撑后续的业务操作。
    简单来说:
    当小王准备去数据库添加一条id为999的数据,他首先应该查询该数据是否存在,经查询不存在,于是他就开始进行插入数据,但是数据已经存在了,无法实现插入的操作,一脸**的小王感觉怀疑人生了,这就发生了幻读。

5.3 隔离级别

隔离级别脏读不可重复度幻读
读未提交 (read uncommitted)未解决未解决未解决
读已提交(read committed)解决未解决未解决
可重复读 (repeatable read)MySQL默认级别解决解决未解决
可串行化 (serializable)解决解决解决

注意:隔离级别从小到大安全性越来越高,但是效率越来越低

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值