一:什么是数据库事务
数据库事务:事务是由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 |
+----+------+---------+
二:事务隔离级别
当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特性