⼿动提交事务的步骤:
执⾏成功的情况:开启事务 -> 执⾏ SQL 语句 -> 成功 -> 提交事务
执⾏失败的情况:开启事务 -> 执⾏ SQL 语句 -> 失败 -> 回滚事务
image
也就是说执⾏start transaction语句后,执⾏SQL语句,不会马上⽣效,⽽是需要执⾏commit语句才会⽣效,执⾏rollback语句则会取消这⼀事务内执⾏过的SQL语句,看起来就好像⼀个⽹页中确定或者取消的操作弹框。
反三角函数图像怎么画
mysql默认⾃动提交事务是可以修改的,只需要执⾏SQL语句set autocommit = 0;
将事务提交⽅式恢复为⾃动提交set autocommit = 1;
freemarker assign这样就不⽤执⾏start transaction⼿动开启事务了。
事务原理
事务开启之后, 所有的操作都会临时保存到事务⽇志中, 事务⽇志只有在得到 commit 命令才会同步到数据表中,其他任何情况都会清空事务⽇志(rollback,断开连接等情况)。
原理图
image
步骤:
1 创建连接时创建此⽤户临时⽇志⽂件
2 开启事务以后,所有的操作都会先写⼊到临时⽇志⽂件中
3 所有的查询操作从表中查询,但会经过⽇志⽂件加⼯后才返回
4 如果事务提交则将⽇志⽂件中的数据写到表中,否则清空⽇志⽂件。
回滚点
在某些成功的操作完成之后,后续的操作有可能成功有可能失败,但是不管成功还是失败,前⾯操作都已经成功,可以在当前成功的位置设置⼀个回滚点。可以供后续失败操作返回到该位置,⽽不是返回所有操作,这个点称之为回滚点。
回滚点操作语句SQL语句
设置回滚点savepoint 回滚点名字;
回滚到回滚点rollback to 回滚点名字;
总结:设置回滚点可以让我们在失败的时候回到设置的某⼀回滚点,⽽不是回到事务开启的时候。
事务的四⼤特性(ACID)
事务特性含义
原⼦性
高清线output和input(Atomicity)
事务是⼀个不可分割的⼯作单位,事务中的操作要么都发⽣,要么都不发⽣。
⼀致性
(Consistency)
事务前后数据的完整性必须保持⼀致
隔离性(Isolation)是指多个⽤户并发访问数据库时,⼀个⽤户的事务不能被其它⽤户的事务所⼲扰,多个并发事务之间数据要相互隔离,不能相互影响。
持久性(Durability)指⼀个事务⼀旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发⽣故障也不应该对其有任何影响
事务的隔离级别
事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题。
这些并发问题都是由于不同事务直接交叉了,没有完全隔离开来。
并
发
访
问
的
问
题
含义
脏读⼀个事务读取到了另⼀个事务中尚未提交的数据,⽐如⼀个事务增加⼀条数据,但是还没有提交,此时另⼀个事务读到并使⽤了这条未提交的数据,这条数据就是脏数据,并不是真实的;因为如果增加这条数据的事务回滚了,那么这条数据就不存在了,但是⼜被另⼀个事务读取使⽤了,就会出
问题。删除和更新操作也是⼀样的
不可重复读⼀个事务中两次读取的数据内容不⼀致,要求的是⼀个事务中多次读取时数据是⼀致的,这是事务 update 时引发的问题 。⽐如事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,⽽事务A再次读取该数据时,数据已经发⽣了改变。
幻读⼀个事务中两次读取的数据的数量不⼀致,要求在⼀个事务多次读取的数据的数量是⼀致的,这是 insert 或 delete 时引发的问题;⽐如事务A事先读取了数据共100条,事务B紧接着删除或者增加两条数据并提交事务,⽽事务A再次统计数据时发现数据量不是100条了。
并发访
问的问题含义
mysql面试题acid脏读这种情况是存在的,⼀个事务未提交的数据,另⼀个事务是能读到的,只不过在MySQL中默认隔离级别为第⼆级,屏蔽了这种情况。可以⼿动设置为读未提交,测试能读到没有提交的数据。
MySQL数据库有四种隔离级别:上⾯的级别最低,下⾯的级别最⾼。 “是”表⽰会出现这种问题, “否”表⽰不
会出现这种问题。
级别名称隔离级别脏读不可重复读幻读数据库默认隔离级别
1读未提交read uncommitted是是是
链接转换工具2读已提交read committed否是是Oracle 和 SQL Server
3可重复读repeatable read否否是MySQL
4串⾏化serializable否否否
二进制换成十进制的方法设置事务隔离级别,需要退出 MSQL 再进⼊ MYSQL 才能看到隔离级别的变化
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论