sql中的事务

先来说说自己对事务的理解。
首先自己对事务的理解就是数据库中一个个完成的事件,我们在每次执行数据库的操作的时候,其实就是完成了一个事务,其实我们在平时使用数据库的时候,就已经在使用事务了。因为数据库默认是自动commit的,所以我们每执行一次操作,便会自动提交事务。所以这里的重点其实是对事务的理解。以及手动commit事务的一些用法以及其作用。

首先是事务的ACID特性
即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
原子性指事务中的操作要么全部完成,要么全部失败撤销
一致性指事务中的操作都是在逻辑上正确的。
隔离性指多个事务之间不互相干扰,并发的事务之间要相互隔离。
持久性是指事务一旦提交,对数据库的操作就是永久性的。

事务的使用

想要控制事务的话,就需要关闭自动提交,这里有两种不同的方式来控制
首先是start transaction
它的意义是开始一个事务,在这个语句之后的操作都属于这个事务之内的,只有在commit之后这些数据才会生效,而使用rollback后就会回滚。回到start transaction语句之前的状态。


另一种就是set autocommit=0
使用这个语句之后就会将当前的模式转换为手动提交,在这之后的所有sql语句,都需要commit之后才会永久性的提交
这里需要注意的是两者的差别,start transaction是不管之前是否设置set autocommit,它都会开始一个手动提交的新事务,直到commit之后,才会生效,rollback之后就会回滚。在commit或者rollback之后,autocommit会自动还原到start transaction之前的状态。
在事务中还可以通过插入保存点来还原到保存点之前的状态,创建保存点的方法是SAVEPOINT point_name
删除是RELEASE SAVEPOINT point_name
回到保存点之前的状态是ROLLBACK TO SAVEPOINT point_name
例如之前作业里的表,我们查询分数

image

新建事务,对分数进行两次修改,并在中间设置存档点并返回存档点
image

image
可以看到数据回到了存档点之前的修改


接下来是事务当中概念较难理解的隔离性
首先,需要了解没有隔离性所会发生的几种问题
1、脏读(Dirty Read)
一个事务处理过程里读取了另一个未提交的事务中的数据
2、不可重复读(NonRepeatable Read)
对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询的间隔期间,另外一个事务修改并提交了该数据
3、幻读(Phantom Read)
在一个事务中读取到了别的事务插入的数据,导致前后不一致
在事务中有四个隔离级别,它们对这3种问题的解决方法用一张图来展示
image

当需要查看当前事务的隔离性是哪个等级的时候,可以使用SELECT @@transaction_isolation命令来查看
image

要修改当前事务的隔离性等级的时候,使用
SET session TRANSACTION ISOLATION LEVEL 隔离等级
image

我们来实际测试一下它的隔离性
我使用了之前作业里的score表
首先新建两个事务
我们在这个事务中查询分数
image

在第二个事务中将所有的分数都加上了20
image

再次查询,发现并没有查询到事务2中所做的改变
image

查询隔离性
image

发现系统默认的是REPEATABLE READ, 因为这种隔离方式不支持脏读,所以没有办法读取到事务2中的改变

我们重新开始一个事务,并将隔离等级改为READ UNCOMMITED

image

再继续新建事务2,修改表中数据
image

这次再在事务1中查询,发现可以查询到变化了
image



接下来还可以尝试不可重复读的效果
在事务1中将隔离等级设置为REPEATABLE READ,并查询成绩
image

在事务2中修改值并提交,查看到值已改变
image

再回到事务1中查询,发现并没有随着变化
image

在事务1中再次执行成绩加20的操作,并查看值
image
可以发现并不是只加了20,事务2的修改也表现了出来,数据的一致性倒是没有被破坏。select操作不会更新版本号,是快照读(历史版本);insert、update和delete会更新版本号,是当前读(当前版本)。

mysql中事务隔离级别为serializable时会锁表,插入记录会显示报错,因此不会出现幻读的情况,这种隔离级别并发性极低,开发中很少会用到。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容