Mysql事务

1.什么是事务

当后台一个业务操作需要同时添加、更新、删除多张数据库表的时候,需要保证同时成功,或者失败。事务,要么一起成功。要么一起失败。不会出现一个成功一个失败的现象。

2.事务的DCL
DCL用来控制数据库的访问,SQL语句执行关键字:

GRANT:授予访问权限
REVOKE:撤销访问权限
COMMIT:提交事务处理
ROLLBACK:事务处理回退
SAVEPOINT:设置保存点
LOCK:对数据库的特定部分进行锁定

3.事务使用
自动提交

若不更改其自动提交变量,则系统会自动向数据库提交结果。关闭自动提交之后,只有使用COMMIT命令后,才会提交事务。

关闭自动提交:SET AUTOCOMMIT = 0;
查看AUTOCOMMIT值:select @@autocommit;

初始化事务 开启了一个事务

START TANSACTION /BEGIN 

提交事务 commit

提交数据,执行COMMIT,数据就会被永久的保存在了数据库中,不可回滚。

事务回滚 rollback

回滚数据,执行ROLLBACK,可以实现数据的回滚,回滚到最近的一次COMMIT之后。

设置保存点 savepoint

使事务回滚到一个指定的位置,必须和ROLLBACK搭配使用,使用方式如下
savepoint 节点名;#节点名自定
rollback to 节点名;
删除事务的保存点
release savepoint 节点名

4事务的特性
每个事务都遵循ACID原则

A.原子性Atomicity:保证事务不可再分。 事务中的所有元素必须作为一个整体提交或回滚
C.一致性Consistency:事务提交前后保持数据的一致。事务开始前,数据处于一致状态。事务完成后,
数据必须再次保持的一致状态。
I.隔离性Isolation:在一个事务开启的操作中,其他事务不可见。事务是独立的,不以任何方式依赖于
或影响其他事务。
D.持久性Durability:事务一旦提交完成后,永久生效。事务完成之后,它对数据库所作的改变是永久性的。

5.事务安全问题

在多线程并发中,同时运行多个事务,这些事务访问数据库相同的数据时,如果没有隔离机制,会导致各种线程安全问题。

脏读:读取到了未提交的数据,回滚后读取脏数据

事务A更新了数据,但是还没提交;事务B就读取到A更新的数据,事务A回滚后,B就看不到更新的数据。

不可重复读:同一个事务中,相同查询语句查出来的数据不一致

两个事务 A, B, A读取了一个字段, 然后B更新并提交了该字段后, A再次读取同一个字段, 值就不同了.

幻读:当前事务对其他事务更改后提交的语句,进行更新,会出现别的事务操作的数据;

两个事务A,B, A从表中读取了一个字段, 然后B在该表中更新了数据事务完成后, 如果A再次读取同一个表, 就会出现B已经修改的数据

更新数据包括 insert update delete
6.事务的隔离级别

Mysql 支持 4 中事务隔离级别。默认的事务隔离级别为可重复读: REPEATABLE-READ
读未提交 READ-UNCOMMITTED
读已提交 READ-COMMITTED
可重复读 REPEATABLE-READ
串行化 SERIALIZABLE

读未提交 read-uncommitted 允许当前事务读取其他事务未提交的数据

事务A更新了数据,但是还没提交;事务B就读取到A更新的数据,事务A回滚后,B就看不到更新的数据

存在问题

脏读、不可重复读、幻读

读已提交 read-committed 只允许当前事务读取其他事务已提交的数据

事务A更新数据并完成提交;事务B内部就可以读取到A更新的数据

存在问题

不可重复读、幻读

可重复读 repeatable-read 当前事务可以多次从一个字段读取相同的值

事务A更新数据并完成提交;在事务B提交之前,其内部无法读取到A更新的数据,只能读取到之前的旧数据。

存在问题

幻读

串行化 serializable 最高的隔离级别,要求事务都串行执行。

事务A和事务B,事务A在操作数据库时,事务B只能排队等待

存在问题

执行效率极低

查看当前的隔离级别

select @@tx_isolation;

查看全局的隔离级别

select @@global.tx_isolation;

设置当前 MySQL 连接的隔离级别:

 set tx_isolation ='SERIALIZABLE';

设置数据库系统全局的隔离级别

set global tx_isolation ='REPEATABLE-READ';

7.锁技术及MVCC
行级锁 InnoDB的前三个隔离级别是行级锁

如果客户端1在修改当前表的一条数据,客户端2也要修改将会等待,客户端2如果要对该数据以外行进行修改不用等。

表级锁 InnoDB 隔离级别是序列化

将会发生整张表的锁。只要对该表操作都需要等待上一个操作完成。

共享锁(shared lock),又叫做"读锁"

读锁是可以共享的,或者说多个读请求可以共享一把锁读数据,不会造成阻塞。

排他锁(exclusive lock),又叫做"写锁"

写锁会排斥其他所有获取锁的请求,一直阻塞,直到写入完成释放锁。

MVCC (Multi-Version Concurrency Control)多版本并发控制机制

  1. MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。不仅是MySQL,包括Oracle、PostgresQL等其他数据库系统也都实现了MVCC,但各自的实现机制不尽相同,因为MVCC没有一个统一的实现标准。
  2. 可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。
  3. MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

8.MySQL的存储引擎
MySQL中常用的四种存储引擎分别是: MyISAM、InnoDB、MEMORY、ARCHIVE。MySQL 5.5版本后默认的存储引擎为InnoDB。

InnoDB采用MVCC来支持高并发,InnoDB的性能和自动崩溃恢复特性,使得它在非事务型存储的需求中也很流行。 MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务。通过间隙锁(next-key locking)策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。

存储引擎的作用及优缺点相关网站:https://www.bilibili.com/read/cv16870629
参考网站:

事务及MVCC

https://baijiahao.baidu.com/s?id=1722528612965200674&wfr=spider&for=pc
https://zhuanlan.zhihu.com/p/365475165
https://www.cnblogs.com/china-golang/p/16691825.html
https://www.jianshu.com/p/9b6fb1be954f
https://www.cnblogs.com/shijiaqi1066/p/3858050.html
https://blog.51cto.com/haofeiyu/5674846
https://zhuanlan.zhihu.com/p/499067876

锁相关

https://www.jianshu.com/p/081a3e208e32
https://www.cnblogs.com/xiatc/p/16257953.html
https://www.jianshu.com/p/191ce4f77725

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值