事务处理
什么是事务
数据库中的事务是指对数据库执行一批操作,在同一个事务当中,这些操作要么全部成功,要么全部失败,不会存在部分成功的情况。
- 事务是一个原子操作。是一个最小的执行单元,可以由一条或者多条
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;