mysql数据库事务

mysql事务的四大特性

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

事务的启动和提交方式

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作

执行命令 set autocommit=0关闭自动提交事务,用来禁止使用当前会话的自动提交。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接

set autocommit=1 开启自动提交事务

事务并发操作产生的问题

脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)

脏读:事务A读取了事务B未提交的数据,事务B的回滚,导致了事务A的数据不一致,导致了事务A的脏读

不可重复读:一个事务在自己没有更新数据库数据的情况,同一个查询操作执行两次或多次的结果应该是一致的;如果不一致,就说明为不可重复读

幻读:事务A读的时候读出了15条记录,事务B在事务A执行的过程中 增加 了1条,事务A再读的时候就变成了 16 条,这种情况就叫做幻影读

需要注意的是:

  • 不可重复读的重点是修改,同样的条件,你读取过的数据,再次读取出来发现值不一样了
  • 幻读的重点在于新增或者删除,同样的条件,第 1 次和第 2 次读出来的记录数不一样

隔离级别

读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现(一个事物读取到了另外一个事物已经提交的事物)

读已提交(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行(一个事物读取到了另外一个事物已经提交的事物)

可重复读(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(一个事务只能重复的读取当前事务的操作数据,不能读取到别的事务未提交和已提交的数据)这是MySQL的默认事务隔离级别

序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值