事务:

事务就是一组原子性的SQL操作,事务内的语句要求全部执行成功,否则全部执行失败。

四大特性:

A:原子性,一个事务是不可分割的最小工作单元,不可能只执行其中的一部分操作。
B:一致性,数据必须确保从一个一致性状态转换到另一个一致性状态。
C:隔离性,一个事务所做的修改在提交前,对其他事务不可见。
D:持久性,一旦事务提交,数据结果会永久保存到数据库中。

隔离级别:

A:read uncommited,

顾名思义就是事务中sql操作,即使没有提交,对其他事务也是可见的。
例如:有张数据表t_sb(id,name),事务1在表中插入一条数据,还未提交,事务2在查询时,便查到了这条数据,这就是脏读。

B:read committed,

一个事务只能看到其他事务提交后的修改,即事务在提交之前,对其他事务不可见。
例如:事务1在表中插入一条数据,并提交了,事务2中是可以查询到的,这是合理的,因为事务1已经提交。但是,如果事务3对此条数据进行了修改,事务2再次查询可能会得到不同于之前查询的结果,因为两次查询结果不一致,导致不可重复读。

C:repeatable read,

可重复读,保证了一个事务中多次读取同样的记录结果是一致的,mysql的默认隔离级别,可以通过var查看。

show variables like '%ISOLATION%';

例如:事务1开始查询某条记录,之后事务2中对目标记录进行了修改并提交,而事务1是看不到事务2的提交的,这就确保事务1中多次查询相同的记录返回的结果是相同的。可以自行测试:

事务1:
set autocommit=off;
start TRANSACTION;
select * from user;
update user t set t.name = '小麦2' where t.id=1;
commit;
事务2:
update user t set t.name = '小麦' where t.id=1;

事务1只能看到本事务中数据的修改,事务2中的修改对事务1不可见,这就保证了可重复读。但是,理论上可重复读还是无法解决幻行问题,即按某个范围查询时,可能会有新增或删除的数据,然而mysql使用MVCC解决了这一问题。

D:serializable,

最高的隔离级别,强制事务进行串行执行,读取的每一行数据都会进行上锁,可以说最大限度保证数据的一致性,同时,牺牲了高并发(因为锁竞争及等待),实际应用很少使用。

多版本控制(MVCC)

为了提升并发性能,很多数据库都实现了MVCC,可以简单理解为行级锁的变种,版本控制也可以简化理解为乐观锁和悲观锁。通过在每条记录上增加两个列(版本号),一个是创建版本号,另一个是删除版本号,每开启一个事务,版本号都会自增。

所以就会有以下简化规则:
select:只能查找小于等于当前版本号的行记录,且没有删除版本号或删除版本号大于当前版本号的。
insert:为新插入的每一行保存当前事务的创建版本号。
delete:将删除的每一行保存当前事务的删除版本号。
update:新增一条记录并保存版本号,将原记录更新删除版本号,这也就是修改=新增+删除。

事务的作用

事务的存在就是为了保证数据的准确性及安全性,即你在银行的存款不会因为系统原因而丢失。


©著作权归作者所有:来自51CTO博客作者mb5fdb0a4002420的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 新RabbitMQ精讲,项目驱动落地,分布式事务拔高
  2. MySQL如何找出未提交事务的SQL浅析
  3. 面试被吊打系列 - 事务隔离级别
  4. Java客户端Jedis 对Redis的几种调用方式包括事务、管道、分布式
  5. Mybatis中的连接池&&事务控制
  6. 安卓009SQLite数据库
  7. Android(安卓)Studio打包时如何将版本号修改成apk名字
  8. Android(安卓)Studio:Support Library依赖包的版本号
  9. Android中判断当前API的版本号方法

随机推荐

  1. Android 平台的几个编译命令----make,mmm
  2. 使用平台的风格和主题
  3. Android跨进程通信IPC
  4. Android中webview加载的网页上的按钮点击
  5. Android(安卓)ZXing改横屏识别为竖屏识别
  6. Appium的安装及简单的使用介绍
  7. Android硬件加速问题
  8. Android如何监听开机广播和关机广播
  9. Android 系统简介
  10. android 中 多个Activity 的跳转 与传值