MySQL数据库——事务的操作(开启、回滚、提交)、特征、隔离级别基础总结

时间:2022-07-25
本文章向大家介绍MySQL数据库——事务的操作(开启、回滚、提交)、特征、隔离级别基础总结,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 1 事务的基本概念

如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。如下A给B转钱的例子很形象的说明了事务的概念:

1.1 事务的操作

  • 开启事务:start transaction;
  • 回滚:rollback;
  • 提交:commit;

【举例】:还是用这个A给B转账的例子,在SQLyog中进行模拟开启事务、回滚、提交

-- 创建表
CREATE TABLE account (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(10),
	balance DOUBLE
);
-- 添加数据
INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);

UPDATE account SET balance = 1000;
SELECT * FROM account;
-- 0. 开启事务
START TRANSACTION;
-- 1. 张三账户 -500
UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
-- 2. 李四账户 +500
-- 出错了...
UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';

-- 发现执行没有问题,提交事务
COMMIT;

-- 发现出问题了,回滚事务
ROLLBACK;

1)在A窗口中先开启事务,然后执行张三账户-500,-》出错了-》李四账户+500,此时查询A窗口数据,张三确实-500,但李四还是100;在B窗口中查询数据,张三和李四都是1000,没发生变化;说明A窗口中开启事务起了作用,且A中查询的数据也只是暂时的。

2)发现错误后,执行回滚操作,再次在窗口A和B中查询,数据都是1000,回滚操作成功。

3)在A窗口中先开启事务,然后执行张三账户-500-》李四账户+500,此时查询A窗口数据,张三确实-500,李四+500;在B窗口中查询数据,张三和李四都是1000,没发生变化;因在A窗口中的操作都OK,执行提交事务,再次在窗口A和B中查询,数据都发生正确变化,事务提交成功。

1.2 MySQL数据库的事务提交

1)事务提交的两种方式

  • 自动提交:MySQL数据库默认是自动提交的,一条DML(增删改语句)会自动提交一次事务;
  • 手动提交:需要先开启事务(START TRANSACTION),再提交(COMMIT);                   Oracle数据库默认是手动提交的;

2)修改事务的默认提交方式

  • 查看默认提交方式:SELECT @@autocommit; -- 1代表自动提交,0代表手动提交
  • 修改默认提交方式:SET @@autocommit = 0; -- 1代表自动提交,0代表手动提交

实际上手动控制事务的开启与提交,可以大幅度提高数据插入的效率,在进行数据批量插入操作时可以手动控制事务。

2 事务的四大特征

1)原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败;

2)持久性:事务一旦提交或回滚,数据表的数据将被持久化的保存;

3)隔离性:多个事务之间相互独立;

4)一致性:表示事务操作前后,数据总量不变。

3 事务的隔离级别

多个事务之间是隔离的,相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别,就可以解决这些问题。

3.1 存在的问题

1)脏读:一个事务读取到另一个事务中没有提交的数据; 【举例】:A给B发1000块钱,手一抖打了10000,这个钱已经打到B的户口,但是事务还没有提交,这时B查下卡,发现多了9000,兴奋坏了,但是A及时发现,马上回滚差点提交的事务,将数字改回1000再提交。

2)不可重复读(虚读):在同一个事务中两次读取到的数据不一样; 【举例】:A拿着卡去购物,卡里有1000块钱,当A买单时(事务开启),收费系统事先检测到他的卡里有1000,就在这个时候,A的妻子要把钱全部拿出来买首饰,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待A的妻子转出金额事务提交完),A就会很郁闷,钱哪去了。。。

3)幻读:一个事务操作(DML)数据表中所有的记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改; 【举例】:A去消费,花了1千元,A的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了1千元,就在这时,A又花了1千元买了一个机械键盘,即新增INSERT了一条消费记录,并提交。当妻子打印消费记录清单时(妻子事务提交),发现花了2千元,似乎出现了幻觉,这就是幻读。

3.2 隔离级别

1)read uncommitted:读未提交      【会产生的问题】:脏读、不可重复读、幻读

2)read committed:读已提交(Oracle默认)     【会产生的问题】:不可重复读、幻读

3)repeatable read:可重复读(MySQL默认)     【会产生的问题】:幻读

4)serializable:串行化     【会产生的问题】:可以解决所有问题

【注意】:隔离级别从小到大,安全性越来越高,但是效率越来越低。但是一般情况下不会修改数据库默认的隔离级别,只有在极特殊情况下才会做出修改已解决一些特殊问题。

数据库查询隔离级别:select  @@tx_isolation;

数据库设置隔离级别:set global transaction isolation level 级别字符串;

———————————————————————————————————————

本文为博主原创文章,转载请注明出处!