(数据库一)数据库中的事务

事务的定义

事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

一个数据库事务通常包含了一个序列对数据库的读/写操作。它的存在包含有以下两个目的:

1.为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。

2.当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

事务的四大特性

数据库事务拥有以下四个特性,被称之为ACID特性:

原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

MySQL并发情况下引起的事务的安全问题

脏读: 一个事务读取另一个事务未提交的问题
不可重复读: 在同一事务中,两次读取同一数据,得到内容不同
幻读: 同一事务中,用同样的操作读取两次,得到的记录数不相同

事务隔离级别

MySQL 中有 4 种隔离级别:
未提交读(READ UNCOMMITTED): 一个事务在提交之前,对其他事务是可见的,即事务可以读取未提交的数据。存在“脏读”(读到了脏数据)问题;
提交读(READ COMMITTED): 事务在提交之前,对其它事务是不可见的。存在“不可重复读”(两次查询的得到的结果可能不同,即可能在查询的间隙,有事务提交了修改)问题。解决了“脏读”问题。
可重复读(REPEATABLE READ): 在同一事务中多次读取的数据是一致的。解决了脏读和不可重复读问题,存在“幻读”(在事务两次查询间隙,有其他事务又插入或删除了新的记录)。— MySQL默认隔离级别
可串行化(SERIALIZABLE): 强制事务串行化执行。即一个事物一个事物挨个来执行,可以解决上述所有问题。

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

MySQL的默认的RR(可重复度)隔离级别下,如何避免事务的安全问题?

在mysql的 Innodb 引擎下,采用 MVCC机制+锁 方式解决事务的安全问题,但在RR(可重复读)的级别下没有完全解决幻读的问题.
解决脏读: 修改时加排他锁(写锁),直到事务提交后才释放;读取时加共享锁(读锁),其他事务只能读取,不能再有更新操作,防止脏读。
解决不可重复读: Innodb 引擎采用了 MVCC(多版本并发控制)来解决不可重复读问题。MVCC 是利用在每条数据后面加了隐藏的两列(创建版本号和删除版本号)。当执行查询时, 当前查询版本号>= 创建版本号 并且 >删除版本号 。MVCC可以在大多数情况下代替行级锁,使用MVCC能降低其系统开销。
解决幻读: MySQL官方给出的幻读解释是:只要在一个事务中,第二次select多出了row就算幻读。
分2种,快照读和当前读
(1) 快照读(mvcc): 普通的 select 就是快照读。将历史数据存一份快照,所以其他事务增加与删除数据对于当前事务来说是不可见的。事务每次取数据的时候都会取创建版本<当前事务的数据,以及删除版本号码>当前版本的数据。
(2) 当前读:执行数据库增删改操作的时候, 就是当前读。

采用next-key锁的方式解决问题
next-key 锁包含两部分:记录锁(行锁)+ 间隙锁, 就是在索引和索引之间上面加锁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值