MySQL事务(详解)

MySQL事务
  • 事务的四大特性:
原子性: 原子性是指事务是一个不可分割的工作单位, 事务中的操作要么
              全部成功,要么全部失败。
一致性: 事务必须使数据库从一个一致性状态变换到另外一个一致性状态
             ( 也就是说 一个事务执行之前和执行之后都必须处于一致性状态。
举例说明:张三向李四转100元,转账前和转账后的数据是正确的状态,这就叫一致性,
         如果出现张三转出100元,李四账号没有增加100元这就出现了数据错误,
         就没有达到一致性
隔离性: 事务的隔离性是 多个用户并发访问数据库时,数据库为每一个用户开启的
              事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性: 持久性是指 一个事务一旦被提交,它对数据库中数据的改变就是永久性的 ,接下来即使数据库发生故障也不应该对其有任何影响。
事务隔离级别介绍
1.多个连接开启各自事务操作数据库中数据时,数据库系统要负责
  隔离操作,以保证各个连接在获取数据时的准确性。(通俗解释)
2.如果不考虑隔离性,可能会引发如下问题:
    *脏读
    *不可重复读
    *幻读
  • 脏读(Dirty read)
  当一个事务读取另一个事务尚未提交的修改时
 (update,insert,delete),产生脏读
  • 不可重复读(Nonrepeatable Read)
不可重复读(non-repeatable read),是指一个事务范围内,多次查询某个数据,却得到不同的结果。
例如下面这张图: 当事务B修改了余额为150,并提交事务时,事务A此时查询的余额为150,
                这是不对的,因为事务A此时还没有提交事务,此时的事务A的余额不应该
                被影响,但是此时的事务A两次读到的数据第一次是100元余额,第二次是
                150元,由于第二个事务的修改,由于第二个事务的修改,第一个事务两次
                读到的数据可能就是不一样的。
不可重复读 和 脏读 的区别:
     脏读是读到未提交的数据,而不可重复读读到的却是已经提交的数据,但实际上是违反了事务的一致性原则。
  • 幻读(Phantom read)
幻读指的是一个事务的查询在多次进行,由于其他提交事务所做的插入(insert)操作,
每次返回不同的结果集,此时发生幻读。
* Read Uncommited,读未提交:即一个事务可以读取另一个未提交事务的数据
                            并发操作会导致脏读
* Read Commited,读已提交:即一个事务要等到另一个事务提交后才能读取数据
                           解决脏读问题,并发操作会导致不可重复读
* Repeatable Read,可重复读:即开始读取数据(事务开启)时,不再允许修改操作;解决不可重复读问题;并发操作会导致幻读(对应insert操作)
* Serializable,序列化:最高的事务隔离级别,该级别下,事务串行化顺序执行;避免脏读、不可重复读与幻读;但是该级别效率低下,比较消耗数据库性能,一般不用。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MySQL事务隔离级别决定了在并发环境下多个事务之间的隔离程度。MySQL提供了四个事务隔离级别,分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。以下是对这四个隔离级别的详细解释: 1. 读未提交(Read Uncommitted):这是最低级别的隔离级别。在该级别下,一个事务可以看到其他事务未提交的修改。这可能导致脏读(Dirty Read)和不可重复读(Non Repeatable Read)的问题。 2. 读已提交(Read Committed):在该级别下,一个事务只能看到其他事务已经提交的修改。这可以避免脏读的问题,但仍可能导致不可重复读的问题。 3. 可重复读(Repeatable Read):在该级别下,一个事务在执行期间能够看到同一结果集的一致性快照。这可以避免脏读和不可重复读的问题,但仍可能导致幻读(Phantom Read)的问题。 4. 串行化(Serializable):在该级别下,事务之间是完全隔离的,每个事务必须按照顺序执行。这可以避免脏读、不可重复读和幻读的问题,但也会导致并发性能的严重下降。 要查看MySQL的默认隔离级别和当前会话的隔离级别,可以使用以下命令: ```sql SELECT @@GLOBAL.tx_isolation, @@tx_isolation; ``` 请注意,MySQL 8之前可以使用上述命令,而MySQL 8及更高版本可以使用以下命令: ```sql SELECT @@global.transaction_isolation, @@transaction_isolation; ``` 这样可以查看默认的全局隔离级别和当前会话的隔离级别。这些隔离级别可以通过设置`transaction_isolation`参数来进行更改。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值