数据库事务

什么是数据库事务?

事务一般是指要做的或者所做的事情,在计算机语言中是访问并可能操作的数据库中各种数据项的一个操作序列。

事务的四大特性(也就是ACID)

原子性(Atomicity):事务中包含对数据库的操作要么都执行,要么都不执行
一致性(Consistency):在发生事务前后,数据库的数据完整性必须保持一致
隔离性(Isolation):多个事务并发执行时,事物之间互不干扰
持久性(Durability):一个事务一旦提交,它对数据库中数据的修改是永久保存的。

事务的实现方式

  • 事务的并发执行(多线程)
  • 日志恢复
    通过这两种方式可以避免数据一致性被破坏。
    在这里插入图片描述

MySQL中事务处理

第一种:用 begin/start transaction,rollback, commit 来实现

  • begin/start transaction 开始一个事务
  • rollback 回滚事务(返回上个操作之前的数据状态)
  • commit 提交事务(一旦提交,无法回滚)
begin;-- 开始事务
update student set sname='李云' where id=04;
commit;-- 手动提交

第二种:直接用 SET 来改变 MySQL 的自动提交模式

  • SET AUTOCOMMIT=0 禁止自动提交

  • SET AUTOCOMMIT=1 开启自动提交

show session variables like 'autocommit';  -- 查看自动提交状态
set session autocommit = 1;  -- 开启自动提交
set session autocommit = off;  -- 关闭自动提交
update student set sname='李云龙' where sid=04;
commit;-- 手动提交

不符合隔离性可能会导致的后果

如果不考虑隔离性问题,那么事务在并发操作时,多个用户同时访问同一个数据,可能引发并发访问的问题

  • 更新丢失
    当两个或多个事务选择同一行,然后基于最初选定的值更新改行时,有于每个事务都不知道其他事务的存在,就会发生更新问题:最后的更新覆盖了由其他事务所做的更新。
  • 脏读
    一个事务读取到另外一个事务尚未提交的数据。
  • 不可重读
    一个事务中前后读取同一个数据得到的内容不一样、或该内容已经被删除。
  • 幻读
    一个事务中前后读取同一个数据得到符合条件的数量不一样。

事务的隔离等级

为了达到事务的四大特性,数据库定义了4种不同的事务隔离级别,由低到高依次为四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

  • 读未提交(READ UNCOMMITTED):最低的隔离级别,可能出现的并发异常也是最多的,允许读取尚未提交的数据变更。

  • 读已提交(READ COMMITTED):允许读取并发事务已经提交的数据

  • 可重复读(REPEATABLE READ) :对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改。

  • 串行化(SERIALIZABLE):最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,事务之间就完全不可能产生干扰。

事务隔离等级解决问题权限

与隔离等级相关的代码格式

查询当前事务隔离级别

select @@transaction_isolation;  --查看当前隔离级别

设置事务隔离级别

-- 格式:set session transaction isolation level 隔离级别;
set session transaction isolation level  read uncommitted; -- 将事务隔离级别设为“读未提交”
-- 设置事务隔离级别为:read uncommitted,read committed,repeatable read,serializable

悲观锁和乐观锁

乐观锁:对事务保持乐观态度,认为不会有其它事务来修改数据,仅在更新前查询是否修改。(没锁)
悲观锁:对事务保持悲观态度,认为一定有其它事务来修改数据,所以操作时会加锁,不让其它事务操作。(加锁)

表锁和行锁

表锁:一次性会将整个表锁定。
行锁:一次锁住1~n行数据

两者的优缺点:

表级锁:开销小,加锁快;较难出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;容易出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值