数据库---事务

一:什么是数据库事务
数据库事务:事务是由DML(数据操作语言INSERT等)语句组成,指作为单个逻辑工作单元执行的一系列操作,这些操作要么全部成功,要么全部失败,是一个不可分割的工作单元。

事务基本操作:
1.开始事务:start transaction ;
2.结束事务: commit 或者 rollback(直接是rollback,是回到事务开始,也就是结束事务)
3.保存点:savepoint pointName
4.回到保存点:rollback to pointName

例:

mysql> create table account(
    -> id int primary key,
    -> name varchar(50) not null default '',
    -> balance decimal(10, 2) not null default 0.0
    -> );  ----默认是innodb存储引擎


mysql> start transaction;   ----开始一个事务
mysql> savepoint a;         -----设置保存点

mysql> insert into account values(1,"张三",10);   ----插入数据

mysql> savepoint b;   -----设置保存点

mysql> insert into account values(2,"李四",25);------插入数据

mysql> select * from account;
+----+------+---------+
| id | name | balance |
+----+------+---------+
|  1 | 张三 |   10.00 |
|  2 | 李四 |   25.00 |

mysql> rollback to b;  -----回到插入李四这个数据前

mysql> select * from account;
+----+------+---------+
| id | name | balance |
+----+------+---------+
|  1 | 张三 |   10.00 |
+----+------+---------+
  • 在commit之后,也就是事务已经提交,不能再设置保存点或者回滚;
  • 可以选择回到具体的保存点,直接rollback是回滚到事务开始;
  • InnoDB支持事务,MyISAM不支持事务(不支持事务指所有操作被提交)

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

无隔离性的问题:
脏读 —读的数据有问题
一个事务正在访问数据,并对数据进行了修改,但是修改操作并没有提交,这时,另一个数据库也访问这个数据,使用了这个数据。

如:

1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务)
2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!
3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000
像这样,Mary记取的工资数8000是一个脏数据。

不可重复读–update,数据值发生改变
在A事务中,多次读取同一个数据。由于同一时间,B事务对数据进行修改并提交事务,导致A事务两次读取数据不一样。即在一个事务内两次读取数据不同,称为不可重复读。

事务1和事务2同时访问数据:
1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题.

幻读—insert,是数据量发生改变(一批数据)

A事务对全表操作,但B事务新插入一行数据或者删除一行数据,导致A事务产生一种幻觉,没有将全部数据进行修改。

目前工资为1000的员工有10人。
1.事务1,读取所有工资为1000的员工。
2.这时事务2向employee表插入了一条员工记录,工资也为1000
3.事务1再次读取所有工资为1000的员工 共读取到了11条记录,

解决办法:A事务提交之前,其他数据不可以添加新数据。

隔离级别

在这里插入图片描述

设置隔离级别:set session transaction isolation level read uncommitted;
查看当前隔离级别:mysql> select @@tx_isolation;

事务的ACID特性

  • 原子性(Atomicity):事务是应用中最小的执行单元
  • 一致性(Consistency):事务从一个一致性数据到另一个一致性状态,每个事务看到的数据是一样的。如果一个事务被迫发生中断,对数据库修改发生变化,但是没有提交事务导致了不一致。因此一致性是通过原子性来保证(在原子里只有失败和成功)。
  • 隔离性(Isolation):事务之间互不干扰,并发事务不能看到对方的中间状态。
  • 持久性(Durability):事务一旦提交,对数据库改变都会记录到永久存储中(磁盘)

猜你喜欢

转载自blog.csdn.net/sophia__yu/article/details/87343215