一.什么事务
事务是单个工作单元,是数据库中不可再分的基本部分.具体来说,事务是由用户定义的一个sql语句序列,在这组sql
序列中,每个mysql语句时相互依赖的,整个sql语句组是一个不可分割的整体.如果在这个sql语句组某条sql语句一旦执行
失败或产生错误,整个语句将会回滚,即将数据表中的数据返回到这个sql语句组开始执行前的状态.
二.事务的4个属性ACID
1.原子性(Atomicity):事务由一个或一组相互关联的sql语句组成, 这些语句被认为是一个不可分割的单元,对事务进行
修改只能是完全提交或完全回滚
2.一致性(Consistency):事务的一致性保含两层意思: 一是从数据的角度来看,事务必须是使数据库从一个一致性
变为另一个一致性,一致性与原子性密切相关,在事务开始之前和结束之后,数据库的完整性约束没有被破坏;而是从
用户的角度看,事务可确保对数据库修改是一致的,即多个用户查询到的数是一样的.
3.隔离性(Isolation,孤立性):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他
事务是隔离的,并发执行的各个事务之间不应该相互干扰,这些通过锁来实现.实际应用中,事务的相互影响程度受到隔离
级别的影响.
4.持久性(Durability):指一个事务一旦提交后,对数据的修改和更新及时永久的.
三.InnoDB引擎引入了与事务处理相关的UNDO日志和REDO日志.
1.UNDO日志
为了满足事务的原子性,在操作数据前,首先将数据备份到UNDO日志文件里.然后进行数据的修改,如果出现错误或者
用户执行了ROLLBACK语句, 系统可以利用Undo日志文件中的备份将数据恢复到事务开始之前的状态
2.REDO日志
和UNDO日志相反,REDO日志记录的是新数据的备份.在数据提交前,不需要将新的数据持久化,只要将REDO日志持久化
即可.此时虽然新的数据没有持久化,但redo日志已经持久化了,在系统崩溃时可以根据REDO日志的内容,将所有数据
恢复到最新的状态.
四.事务的控制
start transaction| begin 用于开启一个事务
commit 表示提交一个事务
rollback 表示回滚一个事务
set autocommit = {0|1}表示用于设置提交事务的默认方式,0 表示禁用自动提交事务, 1 表示自动提交事务.
and chain 表示会在当前事务结束时立刻启动一个新的事务,并且新事务与刚结束的事务有相同的隔离等级;
release 表示在终止了当前事务后,会让服务器断开与当前客户端的连接.如果加上 no,则可以抑制chain 和release
的完成.
五.事务的隔离级别
脏读(DIrty Read): 一个事务读取到了另一个事务未提交的的数据操作结果.
不可重复读(Non-repeatable Reads):一个事务对同一行重复数据重复读两次,但却得到了不同的结果,即产生了虚
读,也就是当事务读取某一数据后, 事务二对其做了修改,当事务再次读该数据时得到与第一次不同的值.
幻读(Phantom Reads):指事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者
缺少了第一次查询中出现的数据,这是由于在两次查询过程中有另外一个事务更新了数据造成的.
1.读未提交
为了避免未授权读取,允许脏读,但不允许更新丢失.如果一个事务已经开始了写数据,则另一个事务则不允许同时进行
写操作,但允许其他事务读此行数据.该隔离级别可以通过"排他写锁"实现.在该隔离级别,所有事务都可以看到其他
未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.
2.读已提交
这是大多数数据库系统的默认隔离级别(但Mysql默认是不是这个级别).读提交的特点是:一个事务只能看见已经提交事务所做的改变:支持不可重复读,读数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行.
3.可重复度
这是Mysql的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时会看到同样的数据行.可重复读可能
会产生幻读的问题.
4.可串行化(Serializable)
这是最高的隔离级别,它通过强制事务排序,使事务只能一个接一个执行,不能并发执行,这样就从根本上阻止了事务之间的相互冲突,从而解决幻读问题.
修改事务隔离级别的语法规则:
set[Global|session]Transation isolation level read uncommitted | Read committed | Repeatable read|
Serializable ;
Global 表示此语句将应用于在此之后所有session,而当前已经存在的session不受影响."session"表示此语句将应用于在此之后所有session之内的以及之后的所有事务;
session
表示此语句将应用于包括当前session在内的及其后的所有事务;如果缺省.表示此语句将应用于当前session在内的
后面未开始事务."Read uncommitted | Read committed | Repeatable read | Serializable"分别表示设置为读未
提交/读以提交,可重复读 和可串行化.
网友评论