MySQL的事务管理学习

     事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是 一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。

一、 事务基本操作:

     以银行转账为例考虑事务:

1.创建测试表:创建一个银行账户(编号,姓名,余额)

create table account(    
id int primary key,    
name varchar(50) not null default '',    
balance decimal(10, 2) not null default 0.0 
);

2.开始一个事务

start transcation;

3.设置保存点(这里是设置保存点进行回滚的,但是不设置保存点也可进行回滚,见https://mp.csdn.net/postedit/83717036

savepoint aa(保存点名称);

4.进行操作

insert into account values(1,'Jack',100);

 5.查询表当前情况

select *from account;

6.进行回滚并在此查询结果

rollback;

效果如下图:

   

事务操作注意事项 :
(1)如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是还没有提交)                             

(2)如果一个事务被提交了(commit),则不可以回退(rollback)                                                                                     

(3)可以选择回退到哪个保存点 InnoDB支持事务,MyISAM不支持事务 

二、事务的隔离级别

      当我们有多个客户端同时操作数据库的某张表,如何进行隔离操作?MySQL提供了隔离级别。

      当MySQL表被多个线程或者客户端开启各自事务操作数据库中的数据时,MySQL提供了一种机制,可以让不同的事务在操作数据时,具有隔离性。从而保证数据的一致性。

2.1无隔离性的问题

(1)脏读

      是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务 也访问这个数据,然后使用了这个数据。

举例:

1.Mary的原数学成绩为88分, 教秘将Mary的成绩改为了98(但未提交事务)  

2.Mary读取自己的成绩 ,发现自己的成绩变为98

3.而教秘发现操作有误,回滚了事务,Mary的成绩又变为了88    

像这样,Mary记取的成绩98是一个脏数据。 

(2)不可重复读

        是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一 个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就 发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容)

举例:

1.在事务1中,Mary 读取了自己的成绩为98,操作并没有完成    

2.在事务2中,这时教秘人员修改了Mary的成绩为89,并提交了事务.    

3.在事务1中,Mary 再次读取自己的成绩时,成绩变为了89        

解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题

(3)幻读
      是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发 生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

举例:

 目前成绩为100分的有10人。    

1.事务1,读取所有成绩为100分的学生。    

2.这时事务2向student表插入了一条学生记录,成绩也为100    

3.事务1再次读取所有成绩为100的学生共读取到了11条记录,          

解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题

小结:

     脏读的意思是读到了不该读的数据;不可重复读的意思是两次读到了不同的数据;幻读的意思原本的数据行数和后来的数据行数发生了变化。

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

2.2事务的隔离级别 

2.2.1

  (1)设置事务的隔离级别

set session transaction isolation level repeatable read;

 (2)查看当前的隔离级别

select @@tx_isolation;

效果如下图: 

   

 2.2.2

  隔离级别:可串行化案例

      当客户端A在执行select过程中,DBMS会对库加锁,如果这时客户端B执行插入,只要还没释放锁,插入不进 去,会将B的update语句放入等待队列,直到释放了锁或超时。

说明:mysql默认的隔离级别是可重复读,一般情况下不要修改 

三、事务的ACID特性 

3.1原子性(Atomicity):
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
3.2一致性(Consistency):
    一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的 时间并发事务有多少。
3.3隔离性(Isolation):
    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干 扰,多个并发事务之间要相互隔离。
3.4持久性(Durability):
    持久性是指一个事务一旦被提交,它对数据库中的数据的修改就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

猜你喜欢

转载自blog.csdn.net/sophie1314/article/details/83716045