Skip to content

事务处理

什么是事务

数据库中的事务是指对数据库执行一批操作,在同一个事务当中,这些操作要么全部成功,要么全部失败,不会存在部分成功的情况。

  • 事务是一个原子操作。是一个最小的执行单元,可以由一条或者多条sql语句组成
  • 在同一个事务当中,所有的sql语句都执行成功时,整个事务成功,有一个sql语句执行失败,则整个事务失败。

存储引擎

支持事务处理的存储引擎:innoDB

开启一个事务

mysql
BEGIN;
INSERT INTO stu(sname,class_id,sex)VALUES('Eddie',2,1);
INSERT INTO class(cname)VALUE("研究生班");
COMMIT;//提交事务

回滚

如果某一条sql语句执行失败或发生异常,则执行回滚。ROLLBACK会终止一个事务。

mysql
START TRANSACTION;
INSERT INTO stu(sname,class_id,sex)VALUES('Eddie-1',2,1);
ROLLBACK;

全局事务

全局事务的意思是:每一条sql语句的执行都是一个事务。

在每一次执行之后都要提交才能将数据存储到myslq中。

mysql
# 开启全局事务
SET autocommit = 0;
INSERT INTO stu(sname,class_id,sex)VALUES("梨花",2,1);
COMMIT;

INSERT INTO stu(sname,class_id,sex)VALUES("梨花-2",2,1);
INSERT INTO stu(sname,class_id,sex)VALUES("梨花-3",2,1);
COMMIT;

事务隔离

产生的原因

事务隔离是当高并发访问mysql执行事务时,多个事务会相互影响的问题。

隔离级别

事务隔离级别是指在上述问题发生时,事务间的隔离程度。

事务隔离级别脏读不可重复读幻读说明
读未提交(read-uncommitted)最低的事务隔离级别,一个事务还没提交时,它做的变更就能被别的事务看到
不可重复读(read-committed)保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。
可重复读(repeatable-read)多次读取同一范围的数据会返回第一次查询的快照,即使其他事务对该数据做了更新修改。事务在执行期间看到的数据前后必须是一致的。
串行化(serializable)事务 100% 隔离,可避免脏读、不可重复读、幻读的发生。花费最高代价但最可靠的事务隔离级别。

查询级别:

mysql
select @@global.transaction_isolation,@@transaction_isolation;

mysql8 以下版本使用这个sql语句查询隔离级别

mysql
select @@tx_isolation;

设置隔离级别

会话隔离级别

mysql
set session transaction isolation level read uncommitted;

全局隔离级别:

mysql
set global transaction isolation level read uncommitted;