(十七)事务
事务
关于事务概念,请看 事务介绍 ;
事务安全
事务(transaction
):一系列将要发生的连续操作 ;
事务安全:一种机制,使得事务的一系列操作,必须要么全部成功,要么全部失败 ;
意义:保证数据操作的完整性 ;
事务操作
事务操作分为两种:自动事务(默认的)
、手动事务
;
-
手动事务
开启事务以后,表明告诉系统,以下的所有操作(写),先都不要直接写入到数据库中,先存放在事务日志中,其中事务日志,在
mysql/data/ib_logfileX
文件里面 ;-- 开启事务 start transaction ; -- 进行事务操作:一系列的sql操作 -- 这时候,进行的一系列操作,其他人查表是看不到的 -- 因为根本就没有进行写操作,都是先存在日志中,等着最后的提交事务 ; ... --关闭事务:提交事务/回滚事务 commit ;/rollback ;
关闭事务:要么操作成功,
提交事务
,此时将日志中的操作结果同步到表中,然后清空日志;要么操作失败,回滚事务
,此时直接将日志全部清空; -
自动事务
在
mysql
中,默认是自动事务的,即自己提交事务 ,它通过系统变量控制;# 查看autocommit 变量值 1代表on,0代表off ; mysql> select @@autocommit ; +--------------+ | @@autocommit | +--------------+ | 1 | +--------------+ 1 row in set (0.01 sec) # 改变为0 ,这时候就需要commit了,否则数据是无法写到数据表的 ; mysql> set autocommit = 0 ; Query OK, 0 rows affected (0.00 sec) mysql> select @@autocommit ; +--------------+ | @@autocommit | +--------------+ | 0 | +--------------+ 1 row in set (0.00 sec)
事务原理
事务开启之后,所有操作都会临时保存到事务日志中,事务日志只有得到 commit
命令才会同步到数据表中,其他任何清空都会清空(rollback
、断电、断开连接) ;
我们平时普通的连接数据库的时候,默认是自动事务(自己提交),也会 开启一个临时事务表,里面保存此次连接,以及一些连接的信息,比如:字符集、自增长等 ;
这种情况下,对数据表的操作是直接写到数据库中的 ;
当我们开始事务以后,对数据表的所有操作,都会写到临时日志文件中,查询数据表的时候,先从数据库查,然后经过临时日志文件的处理,再返回;
最后关闭事务,删除所有的日志文件 ,执行 commit
或者 rollback
;
事务回滚点
当操作失败,关闭事务时,进行 rollback
的时候,可能前面某些操作,我们已经操作成功了,但是回滚会直接回滚掉这些成功操作,但是我们不想重复做那些了,我们可以设置一个点,指定回滚的时候,回滚到该点即可;这个点,就是回滚点( rollback to
) ;
-- 设置回滚点
savepoint 回滚点名字 ;
-- 回滚到具体回滚点
rollback to 回滚点名字 ;
我们自己控制回滚一定要记得 提交事务,否则数据库发现没有提交,自己就又会进行回滚事务 。
事务特性
锁机制
innodb
默认是行锁,但是如果事务操作中,没有使用索引,不能明确的知道数据在哪,那么系统就需要进行全表的检索,这时候,就自动的提升为表锁 ;
行锁
:只有当前操作的行被锁住,其他用户不可以访问该行,但是其他行不影响 ;
表锁
:整张表都不锁住,这张表目前只能供当前操作的用户使用了 ;
当某一个连接开启事务的时候,然后执行某个操作,并且没有索引,导致表被锁,并且没有立即 commit ,这时候其他连接进来,操作(增删改
)该表的时候,是需要等待的 ,如果长时间(大概 30s
),事务还是没提交,表还是被锁,则提示操作失败;
详细的事务介绍 ;
border="0" src="//music.163.com/outchain/player?type=2&id=1302154939&auto=1&height=66" width="0" height="1">