MySQL学习笔记--事务。
mysql事务
一、定义与解决问题
mysql中,事务是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。
比如我们的银行转账:
a->-100
updata user set money =money -100 where name='a';
b->+100
updata user set money=money+100 where name='b';
实际的程序中,如果只有一条语句执行成功,而另一条没有执行成功,就会出现数据前后不一致。
像这种,多条sql语句,可能会有同时成功的要求,要么就同时失败。
二、mysql中如何控制事务?
1、mysql默认是开启事务的(自动提交)
即系统中 autocommit=1;
2、默认事务开启的作用是什么?
当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚(事务回滚,撤销sql语句执行效果)。
create database bank;
create table user(
id int peimary key,
name varchar(20),
money int
);
insert into user values(1,'a','1000');
所有即使执行 rollback; 也不能撤销上一步操作。
要执行撤销操作,应手动设置 关闭mysql的自动提交
set autocommit=0;
如果关闭了自动提交,输入rollback;便可以进行回滚。
三、事务提交方式
(1)自动提交
系统的自动提交 autocommit=1;
不可以回滚。
(2)手动提交
手动设置 set autocommit=0;
然后手动提交 commit;
(3)事务回滚
rollback;
四、事务给我们提供了一个返回的机会。也就是手动提交方式。
(1)手动开启事务
begin 或者
start transaction;都可以帮我们手动开启一个事务。
例:begin;
updata user set money =money -100 where name='a';
updata user set money =money -100 where name='b';
或者:
start transaction;
updata user set money =money -100 where name='a';
updata user set money =money -100 where name='b';
(2)事务开启之后,一旦提交(commit)之后就不能回滚了(rollback)。
例:
begin;
updata user set money =money -100 where name='a';
updata user set money =money -100 where name='b';
此时 rollback;无效。
四、 事务的四大特征:
A 原子性:
事务是最小的单位,不可以分割。
I 隔离性:
事务1和事务2之间具有隔离性。
1、如何查看mysql的隔离级别
mysql 8.0;
select @@global.transcation_isolation;
mysql 5.x;
select @@global.tx_isolation;
2、如何修改隔离级别?
set global transaction isolation level read uncommitted;
修改为 可以读未被提交的级别。
3、隔离级别
1、read uncommitted; 读未提交的(读未被提交的事务叫做脏读,实际开发中不被允许。)
会出现的问题:如果有事务a和事务b,在操作过程中,事务没有被提交,但是b可以看见a的操作结果。
2、read cmmitted; 读已经提交的(问题:不可重复读。)
会出现的问题:事务a在进行查询操作时,事务b修改了表中的数据,事务b修改的数据被事务a读到了。但是在上一步查询中并没有显示,叫做不可重复读。
3、repeatable read; 可以重复读(可能会出现:幻读)
会出现的问题:事务a和事务b同时操作一张表,事务a提交的数据,也不能被事务b读到,就可以造成幻读。
4、serializable; 串行化
优点:当表被第二个事务操作时,若第一个事务未被提交,是不可进行的,就会进入排队状态。
会出现问题: 串行化性能特差!
性能排行 1>2>3>4.
默认隔离是 repeatable read
C 一致性:
事务要求,同一事务中的sql语句,必须保证同时成功或者同时失败。
D 持久性
事务一旦结束(commit,rollback),就不可以返回。
一旦commit;就不能rollback; 一旦rollback;就不能commit;
五、事务开启:
方式(1):
修改默认提交
set autocommit=0;
方式(2):
begin;
方式(3):
start transaction;
六、事务手动提交与回滚
commit;(手动提交)
rollback; (回滚)
上一篇: spring学习笔记(事务)
下一篇: 事务-学习笔记