mysql事务问题

mysql事务小结


一、什么是事务?

数据库中,保证多条语句同时执行,经典案例为:银行转账,如下图:
当实现张三从自己账户中转入李四账户中1000元时,我们需要保证张三账户的数据更新的同时,李四的账户同时更新,此时我们便需要用到事务的特性account表

二、使用步骤

1.查看事务提交方式

代码如下:

select @@autocommit;(mysql中数据库提交方式默认为1,即自动提交)

2.手动开启事务

代码如下:

start TRANSACTION / begin

3.手动开启事务

对数据库中的账户更新语句如下:

update acount set account = account - 1000 where ename = '张三';

update acount set account = account + 1000 where ename = '李四';

当未提交时,数据库中的数据不会发生改变

4.事务提交

当上述更新语句执行无误时,执行提交操作commit,可以实现事务的执行,如下:commit执行后

此时,提交之后数据库内的信息均发生了改变,如下:
事务执行结束

5.事务回滚

当事务中出现错误时,如图:
sql中第二条语句未执行
此时如果继续提交,则张三的账户中会少1000元,而李四的账户却并不会增加,此时的数据便发生了错误,因此,就需要对已经执行的sql语句进行回滚(rollback)来防止错误的发生,如下:rollback

三、事物的四大特性ACID

1.原子性

事物的原子性主要是指事务中的语句要么便一条都不执行,要么一口气全部执行完成,可以保证事物的执行不发生错误

2.一致性

当事务执行完成后,数据库中的数据均保持一致,即张三和李四的工资综合依旧保持不变

3.隔离性

两个事务在独立的环境下运行,并不会互相影响

4.持久性

事务一旦完成,更新后的数据就保存在了磁盘之中

四、并发事务的问题

1.脏读

一个事务读取到了另一个事务还未提交的数据

2.不可重复读

一个事务先后读取数据库,但两次读到的内容不一致

3.幻读

事务读取数据库时,发现并未有该行,担当执行插入操作时,发现该行已存在

五,对并发事务问题解决的方法

在这里插入图片描述
上到下隔离级别越来越高,但是安全性越来越差(oracle默认read commit)。

1.查看事务的隔离级别

select @@transaction_isolation;

2.设置事务的隔离级别

set session transaction isolation level .......;

3.事务的脏读

在这里插入图片描述
当设置事务为read uncommitted时,左侧与右侧同时开启事务,当更新左侧的张三account却并未提交时,可以发现右侧查询到的张三的account也发生了改变,此时发生了脏读。
将事务的隔离级别调整为read commit时,下图可见,左侧无法查询出,修改后的结果,因此,read commit可以避免数据的脏读:
在这里插入图片描述

4.事务的不可重复读

右侧的数据提交前后,左侧查询的结果不一致,便是不可重复读现象,如下:在这里插入图片描述

4.事务的不可重复读

当开启repeatable read时,数据便,可重复读,即在右侧提交前后,左侧查询出的数据一致:在这里插入图片描述
左侧提交后才看到最新数据

5.幻读问题

左侧选择id=3时失败,并未显示,当右侧执行完之后,左侧进行插入失败,显示id=3已经存在,此时出现幻读问题,如下图:
在这里插入图片描述
当改用serializable时则可避免幻读问题,左侧查询后,右侧插入会一直等待:在这里插入图片描述
当左侧提交后,右侧报错:在这里插入图片描述

详见:黑马课程

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值