数据库-事务

1 什么是事务

事务就是将一堆的SQL语句(通常是增删改操作)绑定在一起执行,要么都执行成功,要么都执行失败,即都执行成功才算成功,否则就会恢复到这堆SQL执行之前的状态。

2 事务的四大特性

  • 原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败
  • 一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账户金额之和在事务前后是保持不变的。
  • 隔离性(Isolation):隔离性是指在并发操作中,不同事务会隔离开来,使每个并发中的事务不会相互干扰。也就是说,在事中务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。例如:在A事务中,查看另一B事务(正在修改张三的账户金额)中张三的账户金额,要查看到B事务之前的张三的账户金额,要么查看到B事务之后张三的账户金额
  • 持久性(Durability):一旦事务提交成功,事务中所有的数据操作都会被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也能通过某种机制恢复数据。

3 MySQL中的事务

-- 开启事务
start transaction;
--SQL操作...
-- 回滚事务
rollback;
--提交事务
commit;
--中断操作
quit;

4 事务并发读问题

多个事务对相同的数据同时进行操作,这叫做事务并发.可能会导致各种并发问题

4.1 脏读

  • 在一个事务中,读取到另一个事务未提交更新的数据,即读取到了脏数据

例如:在一个事务中,A给B转账100元但未提交事务,在另一事务中B查询账户金额,查询到了A未提交更新的数据,我们称之为脏读

4.2 不可重复读

对同一记录的两次读取结果不一致,因为在两次查询期间,有另一事务对该记录做了修改(是针对修改操作)

例如:在事务1中,前后两次查询A账户的金额,在两次查询之间,另一事务2对A账户的金额做了修改(并且也提交了事务),此种情况可能会导致事务1中,前后两次查询的结果不一致。这就是不可重复读

4.3 幻读

对同一张表的两次查询结果不一致,因为在两次查询期间,有另一事务进行了插入或者是删除操作(是针对插入或删除操作);

5 如何防止事务并发读问题的产生

  • mysql默认的是不允许出现脏读和不可重复读
  • 通过设置事务隔离级别进行预防
-- MySQL查询当前的事务隔离级别
select @@tx_isolation;
-- MySQL设置事务隔离级别
set tx_isolation='read-uncommitted';

6 事务隔离级别

事务隔离级别分四个等级

6.1 READ UNCOMMITTED(读未提交数据)

安全性最差,可能出现任何事务并发问题(比如脏读、不可以重复读、幻读等)
但性能最好(不使用!!)

6.2 READ COMMITTED(读已提交数据)(Oracle默认)

可以防止脏读,但不能防止不可重复读,也不能防止幻读;

6.3 REPEATABLE READ(可重复读)(MySQL默认)

可以防止脏读不可重复读,但不能防止幻读问题;

6.4 SERIALIZABLE(串行化)

安全性最高,不会出现任何并发问题,因为它对同一数据的访问是串行的,非并发访问;

7 数据库锁

在这里插入图片描述

  • 乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。乐观锁的实现方式一般包括使用版本号和时间戳。
  • 悲观锁一般就是我们通常说的数据库锁机制
    • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
    • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
    • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
  • 在MyISAM中只用到表锁
  • innodb实现了行级锁和表锁,InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

8 事务与数据库锁的关系

  • 事务与锁是不同的。事务具有ACID(原子性、一致性、隔离性和持久性),锁是用于解决隔离性的一种机制。
  • 事务的隔离级别通过锁的机制来实现。另外锁有不同的粒度,同时事务也是有不同的隔离级别的。
  • 开启事务就自动加锁。

9 MySQL存储引擎InnoDB与Myisam

9.1 MyISAM

MyISAM的索引和数据是分开的

  • 优点:查询数据相对较快,适合大量的select,可以全文索引
  • 缺点:不支持事务,不支持外键,并发量较小,不适合大量update

9.2 InnoDB(默认)

索引和数据是紧密捆绑的

  • 优点:支持事务,支持外键,并发量较大,适合大量update
  • 缺点:查询数据相对较快,不适合大量的select
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值