目录
事务简介
事务操作
查看/设置事务提交方式
提交事务
回滚事务
事务四大特性(ACID)
并发事务问题
脏读
不可重复读
幻读
事务隔离级别
事务简介
事务 是一组操作的集合 ,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么成功,要么同时失败。
举个例字就像张三向李四转账1000,但是完成这个操作,首先查看张三的余额有没有1000元,然后让张三的余额减少1000元,李四的余额加上1000元,
默认MySQL的事务是默认提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
事务操作
数据准备
create table account( id int auto_increment primary key comment '主键ID', name varchar(10) comment '姓名', money int comment '余额' ) comment '账户表'; insert into account(id, name, money) values (null,'张三',2000),(null,'李四',2000);
转账操作
--转账操作 --1.查询张三账户的余额 select * from account where name ='张三'; --2.将张三账户-1000 update account set money = money -1000 where name = '张三'; --3.将李四账户+1000 update account set money = money +1000 where name = '李四';
如果在3行上面写一段中午“程序抛出异常”,导致不能使李四的账户+1000元,即处理异常
查看/设置事务提交方式
SELECT @@autocommit;
SET @@autocommit = 0;
@@ autocmmit = 1是自动提交的意思,但是@@autocmmit = 0,是手动提交的意思
提交事务
COMMIT;
commit 命令用来将事务中的修改保到数据库中,同时结束事务。
回滚事务
ROLLBACK;
rollback 命令用来将数据库恢复到事务开始前的状态,即撤销事务所做的一切修改并结束事务
首先初始的时候
SELECT @@autocommit;
可以的到的是 @@autocommit = 1; 这个是等于1是自动提交的意思,然后我们通过
set @@autocommit = 0; 将提交模式改为手动提交,如果执行完更新数据的语句,必须要手动的写一个 commit ,并执行,进行语句的提交
如果执行的语句出现了错误,那么就需要用回滚事务语句 rollback ,不让语句去执行,返回之前的方式
事务四大特性(ACID)
原子性:(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性:(Consistency):事务完成时,必须使所有的数据都保持一致状态。
隔离性:(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性:(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
优秀的数据库软件要确保每个事务都有ACID特性,并且具有很好的恢复特性,可以在机器有各种原因崩溃时恢复数据库
并发事务问题
脏读
开始时,事务A,执行select操作,然后执行update操作,但是没有完成3的操作即没有提交事务, 但是此时事务B的1select操作,查找的数据就是update更新后的数据,这种问题就是脏读
不可重复读
开始时,执行事务A的1操作,select id= 1,到数据库,然后并发事务B同时更新id= 1 数据,并提交到数据库,此时事务A的3操作,再去进行select 操作,发现前后数据不一样,这个问题就叫不可重复读
幻读
就是最开始在事务A中进行查找id 为1的数据,发现没有这个数据,然后并发事务B进行insert,插入操作,并提交到数据库,事务A,在进行第二步操作,插入数据,但是插入不了,因为id是主键,id是唯一的,我再进行3步操作,进行select操作,但是并没有发现这些数据,因为我们已经解决了不可重复读得问题,这种插入时提示有数据,但是再次查找时却找不到这中操作叫不可重复读
事务隔离级别
注:√ 代表存在,×代表不存在
--查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
--设置事务隔离级别
SET, [SESSION| GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
代码:
--查看事务隔离级别 select @@transaction_isolation; --设置事务隔离级别 set session transaction isolation level read uncommitted; set session transaction isolation level repeatable read ;
(默认隔离级别是 repeatable read )