MySQL事务

MySQL事务

1.事务(Transaction):

   事务是用来保证一个业务操作的完整性,要么成功、要么失败、不允许部分成功、部分失败。

2.事务四大特性(ACID):

    原子性(Atomicity): 事务中所有操作视为一个原子单元,及对于事务进行的数据修改操作只能是完全
 提交或者完全回滚。
               
   一致性(Consistency): 事务在完成时,必须使所有的数据从一种一致性状态变更为另外一种一致性状态,
所有的变更都必须 应用于事务的修改,以确保事务的完整性。

   隔离性(Isolation): 一个事务中的操作语句所做的修改必须与其他事务所做的修改相隔离。也就是说在
进行事务查看时数据所处的状态,要么是被另一并发事务修改之前的状态,及当前事务不会查看由另外
一个并发事务正在修改的数据。而这种特性是通过锁机制来实现的。
                   
   持久性(Durability): 事务完成之后,所做的修改对数据的影响是永久的,即使系统重启或者出现故障
数据仍可以恢复。

3.MySQL中的多种事务型存储引擎:InnDB(默认)和BDB

    InnDB存储引擎支持ACID事务、行级锁、高并发。为支持事务,InnDB存储引擎引入了与事务相关的REDO
日志和UNDO日志。
REDO日志
  事务执行时需要将执行的事务写入到日志文件里,对应的文件为REDO
日志。当每条SQL进行数据库更新操作时,首先将REDO日志写入日志缓冲区
。当客户端执行COMMIT命令提交时,日志缓冲区的内容将被刷新到磁盘,日
志缓冲区的刷新方式或者时间间隔可以通过参数innodb_flush_log_at_trx
_commit控制。
UNDO日志
  与REDO日志相反,它主要用于事务异常时的数据回滚,具体内容就是复制
事务前的数据库内容到UNDO缓冲区,然后再合适的时间将内容刷新到磁盘。

MySQL还有很多存储引擎,这里就不一一介绍了,详情见下图

#查看MySQL提交数据方式(默认为1,1为自动)

SELECT @@autocommit

#更改提交方式(0为手动提交)

SET @@autocommit = 0

#开始事务(和上边将提交数据方式改为手动结果一样)

BEGIN
#或者
START TRANSACTION

#回滚事务

ROLLBACK;

#提交(结束)事务

COMMIT;

4. MySQL隔离事务级别:

指定事务中哪些数据改变其他事物可见,
哪些数据改变其他事务不可见,低级别的隔离级别可以支持更高的并发处理。

级别从低到高:读未提交 ->读已提交->可重复读->可串行(序列)化
(性能从高到低)    
读未提交(READ UNCOMMITTED):
    在该隔离级别,所有事务都可以看到其他未提交事物的执行结果。因为 其性能也不必其他级别高很多,因此
 该隔离级别在实际应用中很少使用,读 取未提交的数据被称为脏读(Dirty Read)。比如某个事务已更新一份
 数据,另一个事务在此时读取了同一条数据,由于某些原因(比如数据错误)前边的事务进行了回滚操作,则
 后边的事务读取到的数据就会显示不正确。
        
读已提交(RENAD COMMITTED):
    这是大多数数据库默认的隔离级别,但并不是MySQL的默认隔离级别。 它的定义为:一个事务从开始到提
 交前所做的任何改变都是不可见的,事务只能看见已经提交事务所做的改变。这种隔离级别也会引发所谓
 的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理期间可能会有新的数据提交导
 致数据改变,所以同一查询可能返回不同的结果。
  
可重复读(REPEATABLE READ):
    这是MySQL的默认事务隔离级别,它能确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
因此它会导致另一问题:幻视(Phantom Read),即在一个事务的两次查询中数据笔数不一样。比如,有一个
事务查询了几列数据,而另外一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会
发现有几列数据是先前没有的。
         
可串行化(LEVEL SERIALIZABLE):
    这是最高的隔离级别,但效率也是最低的。通过强制事务排序,使之不可能相互冲突,从而解决幻视问题。

#查看事务隔离级别

SELECT @@tx_isolation; -- 默认为REPEATABLE-READ(可重复读)

#设置隔离级别

SET @@tx_isolation = 'read-uncommitted'

5.隔离级别可能会产生的问题:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值