Mysql事物
Mysql事物
事物这个东西大家应该写过项目的就用过,但是还是要说的
为什么需要事物
现在很多软件都是多用户,多程序,多线程的,对同一张表可能同时有很多人在用,为保持数据的一致性,所以提出了事物的概念
A给B转钱,A账户减1000,B账户就必须加1000,这两个Update为一个整体,要么都成功,要么都失败,不然A没减钱,B加了,或者A减了钱,B没加,这就有点意思了哈
查看那种存储引擎支持事物
show engines;
看了之后很尴尬,只有Innodb支持,5.5之后默认就是
虽然看见了 但是还是要说一下默认的存储引擎查看方式的
show variables like "%storage_engin%"
不管是普通表,还是临时表都是InnoDB
查看某张表的存储引擎,其实就是查建表语句
show create table [tableName];
创建表时指定存储引擎
create table ( ...)ENGIN=[StorageEnginName]
修改表的存储引擎
alter table [tableName] engin = [storageEnginName]
事物的特性:
事物应该具有4个属性:原子性,一致性,隔离性,持久性.这四个属性通常称为ACID特性;
原子性(atomicity):一个事物是一个不可分隔的工作单位,事物中包括的诸多操作,要么都成功,要么都失败;
一致性(consistency):事物必须是使数据库从一个一致性状态变成另一个一致性状态与原子性是密切相关的;
隔离性(isolation):一个事物的执行不能被其他事物干扰,即一个事物内部的操作及使用 数据对并发的其他事物是隔离的,并发执行的各个事物之间不能互相干扰;
持久性(durability):持久性也称永久性(permanence),即一个事物一旦提交,他对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其有任何影响;
持久性并不是数据库的角度完全能解决的
事物的隔离级别
未提交读(read uncommitted)脏读
已提交读(read committed)不可重复读
可重复读(repeatable read)
可串行化(serializable)
查询Mysql事物的默认隔离级别
select @@tx_isolation;
Mysql事物的默认隔离级别是repeatable read
事物并发问题
脏读:事物A读取了事物B更新的数据,然后B回滚操作,那么A就读取到了脏数据
不可重复读:事物A多次读取同一数据,事物B在事物A多次读取的过程中,对数据做了更新并提交,导致事物A多次读取同一数据,结果不一致;
幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B,就在这个时候插入了一条分数记录,当系统管理员A改完之后发现还有没改的,就像幻觉一样,这就是幻读
不可重复读和幻读容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除,解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
//设置当前会话的事物隔离级别
set session transaction isolation level [隔离级别]
事物隔离级别(总结)
事物隔离级别为可重复读时,如果有索引(包括主键索引)的时候,以索引列为条件更新数据,会存在间隙锁间,行锁,页锁的问题,从而锁住一些行,如果没有索引,更新数据时会锁住整张表;
事物隔离级别为串行化时,读写数据都会锁住整张表
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大,对于多数应用程序,可以优先考虑把数据库系统的隔离级别设置为read committed,它能避免脏读,而且具有较好的并发性能
事物语法:
开启事物:
1:begin
2:start transaction(推荐)
3:begin work
事物回滚
rollback
事物提交
commit
还原点
savepoint
还原点的使用,在我看来用处也不打,知道一下就可以,
作者:彼岸舞
时间:2020\07\08
内容关于:Mysql
本文来源于网络,只做技术分享,一概不负任何责任