Mysql事务

事务定义

一个事务会涉及大量的cpu操作和IO操作,这些操作会被打包成一个执行单元,要么同时完成,要么同时都不完成。

事务是一组原子性的sql命令或者说是一个独立的工作单元,如果其中任何一条sql语句因为崩溃或者其他原因执行失败,那么该组所有的sql语句都不会执行。如果没有显示启动事务,数据库会根据autocommit的值,默认每条sql操作都会自动提交。

事务的特性ACID

原子性(A)

一个事务中的所有操作,要么都完成,要么都不执行,对于一个事务来说,不可能只执行其中的一部分。

一致性(C)

数据库总是从一个一致性的状态转换到另一个一致性的状态

隔离性(I)

一个事务所做的修改在最终提交之前,对其他事务是不可见的。多个事务之间的操作相互不影响。每降低一个事务的隔离级别都能提高数据库的并发,但同时不安全性就增加了。关于事务的隔离级别后续还要详细讨论。这里简单介绍一下:

  • 读未提交:其他事务未提交就可以读。
  • 读已提交:其他事务只有提交了才能读。
  • 可重复读:只管自己启动事务时候的状态,不接受其他事务的影响。
  • 串行化:按照顺序提交事务保证了数据的安全性,但无法实现并发。

持久性(D)

事务一旦提交,就要更新到数据库中,不能回滚。就算服务器宕机,仍然需要在下次启动的时候自动执行事务中的sql命令,体现到数据库中。

数据库事务隔离界别

介绍

隔离界别 脏读 不可重复读 幻读
未提交读(Read uncommited) 可能 可能 可能
已提交读(Read commited) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
串行化(Serializable) 不可能 不可能 不可能
  • 未提交读(Read uncommited):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据。
  • 已提交读(Read commited):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别。
  • 可重复读(Repeatable read):可重复读。在同一事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,改级别消除了不可重复读,但还是存在幻象读,但InnoDB解决了幻读。
  • 串行化:完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

准备数据

准备一个账户表,表里三个字段,分别是主键id,账户名和金额

create table account(
	id int(11) not null auto_increment,
	customer_name varchar(255) not null,
	money decimal(10,2) not null,
	primary key(id),
	unique uni_name using btree (customer_name)
) ENGINE = 'InnoDB' AUTO_INCREMENT=10 COMMENT = '账户表';
复制代码

验证RU(未提交读)

1、开启两个会话,设置隔离级别为read uncommited

set session transaction isolation level read uncommitted;

select @@session.tx_isolation;
复制代码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值