数据库事务、死锁和存储引擎

存储引擎

事务

1.事务的特性

  如果一个数据库支持事务,则数据库必定具备以下四个与事务相关的特性(ACID):

⑴ 原子性(Atomicity)

  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

⑵ 一致性(Consistency)

  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

  拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

⑶ 隔离性(Isolation)

  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

  关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

⑷ 持久性(Durability)

  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

对事务的理解:

  不开启事务的情况下,默认单条sql语句存在于一个事务中,语句执行成功,事务自动提交,所以可以这么认为,不管有没有开启事务,所有语句都执行在事务中,只是这个事务的范围是大还是小而已。

2.数据库在并发过程中的问题

1.脏读

  外部读取到了某个事务内未提交的变更。

2.不可重复读

  外部读取到了某个事务内已提交的变更,这个变更指列中数值的变化。

3.虚读

  外部读取到了某个事务内已提交的变更,这个变更指行数量的变化(添加行、删除行)。

事务的隔离级别

  如何避免以上问题,这与事务的隔离级别有关。mysql默认的隔离级别为:Repeatable read.

√: 可能出现    ×: 不会出现

  脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

对于事务隔离级别的理解:当前数据库连接中的隔离级别,代表了该连接中对数据的严谨程度,不管当前连接中的隔离级别怎么变化,都不会影响其他连接,只会影响到自己。

常用指令

修改数据库的隔离级别

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

查看当前数据库连接的事务隔离级别

select @@tx_isolation;

1.演示Read uncommitted

  对于连接A,处于默认的隔离级别下,开启事务,修改test1数据(字段自增后的值为3),不提交事务。

  接着创建连接B,修改隔离级别为Read uncommited,接着查询test1的数据,出现脏读情况,读取出数据为3.

2.演示Read committed

  在以上的例子中,继续操作,将连接B的隔离级别修改为Read commited,再次读取数据为2,脏读情况消失。

  接着,B连接开启事务,另一边A提交事务(查询数据为3),B在事务中查询数据,结果为3,出现了“不可重复读”问题,然后B提交事务

3.演示Repeatable read

  (1)A再次开始事务,对数据进行自增,读取数据为4,事务不提交。

  (2)另一边B修改隔离级别为repeatable read,开启事务,查询数据为3.(脏读情况没有出现)。

  (3)A提交事务,然后B出现了“不可重复读问题”。B读取数据为4

4.演示Serializable

死锁

猜你喜欢

转载自www.cnblogs.com/hellohello/p/9385435.html
今日推荐