Mysql数据库--事务

1. 概念

mysql 事务是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。

比如我们的银行转账:

a->-100
update user set money=money-100 where name='a';
b->+100
update user set money=money+100 where name='b';

这就是一个事务,就是a给b转账,他俩的账户应该同时发生变化。

实际程序中,如果只有一条语句执行成功了,而另外一条没有执行成功?
出现数据前后不一致

update user set money=money-100 where name='a';
update user set money=money+100 where name='b';

因此在同一个事务中的多条sql语句,可能会有同时成功的要求,要么就同时失败。

2. Mysql 中如何控制事务

2.1 mysql 默认是开启事务的(自动提交)。

查询
mysql> select @@autocommit; // 表示自动提交,每个sql语句都已经实现,所以无法撤销

在这里插入图片描述
默认事务开启的作用是什么?

—当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚(rollback)。
在这里插入图片描述

mysql> insert into user values(6,"b",1000);

//由于此时数据库的事务是自动提交所以此时回滚操作并不会生效

rollback;

在这里插入图片描述
设置mysql 自动提交为false 表示未执行语言,每次进入mysql都是默认提交
set autocommit =0;
//关闭了mysql 的自动提交

mysql> set autocommit =0;
Query OK, 0 rows affected (0.01 sec)

此时我们就可在开启事务后对操作进行回滚。
操作完成后想写入表中可以使用以下命令,这样你的操作结果就会写入到表中,不会被回滚。表示事务结束

commit;

// 自动提交?
@@autocommot=1; 每次进入数据库就会重新设置为1,需要手动设置回0
//手动提交?
commit;
//事务回滚?
rollback;
//事务提供给程序员一反悔的语句,如果没问题就真正写入数据中,没有成功就rollback回滚撤销操作
//开启自动提交
set autocommit=1;
如何开启一个事务:

begin;
start transaction;  

上边两个命令都可以手动开启一个事务

2. 事务的特征:

ACID

A:原子性,事务是最小的原子单位,不可以在分割
C:一致性:事务要求,同一个事务中的sql语句必须保证同时成功或者失败
I:隔离性:事务A和事务B之间是具有隔离性的,
D:持久性:事务一旦结束就永久生效,不可以返回。

事务开启:
1.修改默认提交,set autocommit=0;
2.begin;
3.start transaction;
事务提交:
commit;
事务回滚:
rollback;

3. 事务的隔离性

1.read uncommitted; 读未提交的 脏读 不可重复读 幻读
2.read committed; 读已提交的 不可重复读 幻读
3.repeatable read; 可以重复读 幻读
4.serializable; 串行化 性能最差

3.1 read uncommitted

如果有事务a、b
a事务对数据进行操作,操作过程中,事务没有提交,但是b可以看见a的操作结果。
这就是脏读

—转账业务,小明转账给淘宝800
小明 账户有1000
淘宝 账户有1000

insert into user value(2,'小明',1000);
insert into user value(3,'淘宝店',1000);

mysql> select * from user;
+----+-----------+-------+
| id | name      |</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值