首页
统计
壁纸
关于我
Search
1
Mysql delete from table 和 truncate table 的区别
887 阅读
2
Spring AOP 术语说明
773 阅读
3
MySQL事务隔离级别
707 阅读
4
Java引用类型:强引用、软引用、弱引用、软引用
639 阅读
5
好冷
104 阅读
随笔
时政
技术
登录
Search
标签搜索
Java
Mysql
Xiaodong
累计撰写
6
篇文章
累计收到
43
条评论
首页
栏目
随笔
时政
技术
页面
统计
壁纸
关于我
搜索到
2
篇与
的结果
2020-07-07
MySQL事务隔离级别
什么是事务事务的定义数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。假如A转账给B 100元,先从A的账户里扣除100元,再在B的账户上加上100元。如果扣完A的100元后,还没来得及给B加上,银行系统异常了,最后导致A的余额减少了,B的余额却没有增加。所以就需要事务,将A的钱回滚回去,就是这么简单。事务的四大特性原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。事务并发存在的问题假设现在有张表CREATE TABLE `account` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `balance` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `un_name_idx` (`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;数据如下idnamebalance1张三1002李四200更新丢失(lost update)A和B事务并发执行,A事务执行更新后,提交;B事务在A事务更新后,B事务结束前也做了对该行数据的更新操作,然后回滚,则两次更新操作都丢失了。第一类丢失更新(回滚丢失,Lost update)事务A和B并发执行,A事务修改数据并提交事务,然后B事务回滚事务,A事务已经提交的数据被回滚。时间节点A事务B事务T1开始事务-T2-开始事务T3查询账号余额 100 元-T4-查询账号余额 100 元T5存入 100 元,账户余额 200 元-T6提交事务-T7-取款10元,账户余额 90 元T8-回滚事务T9-账户余额 100 元(A事务更新丢失)第二类丢失更新(覆盖丢失/两次更新问题,Second lost update)事务A和B并发执行,A事务修改数据并提交事务,然后B事务修改数据并提交,A事务已经提交的数据被覆盖。时间节点A事务B事务T1开始事务-T2-开始事务T3查询账号余额 100 元-T4-查询账号余额 100 元T5存入 100 元,账户余额 200 元-T6提交事务-T7-取款10元,账户余额 90 元T8-提交事务T9-账户余额 90 元(A事务更新被覆盖)脏读(dirty read)A和B事务并发执行,A事务读取了B事务修改后未提交的数据,如果之后B事务进行事务回滚,则事务A读到的数据是不存在的脏数据。时间节点A事务B事务T1开始事务-T2-开始事务T3-查询账号余额 100 元T4-取款10元,账户余额 90 元T5查询账号余额 90 元-T6存入 100 元,账户余额 190 元-T7-回滚事务T8-账户余额 100 元T9提交事务-T10账户余额 190 元(数据被B事务干扰)-不可重复读(unrepeatable read)A和B事务并发执行,A事务读取了B事务修改并已经提交的数据,导致A事务内多次读取同一记录但结果却不相同不稳定。时间节点A事务B事务T1开始事务-T2-开始事务T3查询账号余额 100 元-T4-查询账号余额 100 元T5-取款10元,账户余额 90 元T6-提交事务T7查询账号余额 90 元(数据被B事务干扰)-幻读(phantom read)A和B事务并发执行,A事务读取了B事务提交的新增数据,这时A事务将出现幻读的问题。幻读一般发生在计算统计数据的事务中。时间节点A事务B事务T1开始事务-T2-开始事务T3查询ID大于1的账户数量:1-T4-新增账户(id:3,name:王五,balance:300)T5-提交事务T6查询ID大于1的账户数量:2 (莫名其妙多出一条数据)-可以看出前面几种问题都偏重于对同一记录的修改更新,幻读偏重于多条记录的增删,它们之间是递进的。事务的四大隔离级别ISO标准定义了4个事务隔离等级,分别是读未提交(Read Uncommitted)读已提交(Read Committed)可重复读(Repeatable Read)串行化(Serializable)MySQL查看和设置隔离级别查看MySQL当前事务隔离级别命令:* show variables like 'tx_isolation' * show variables like 'transaction_isolation' * select @@tx_isolation * select @@transaction_isolation设置本次会话的事务隔离级别该设置只对本次会话的事务生效,不影响其他会话,随着本次会话关闭而失效。set session transaction isolation level read uncommitted / read committed / repeatable read / serializable设置全局会话的事务隔离级别该设置不影响当前已连接的会话,新会话使用新的事务隔离级别。set global transaction isolation level read uncommitted / read committed / repeatable read / serializable设置一次操作的事务隔离级别该设置只对下一次事务生效,随着事务的提交而失效。set transaction isolation level read uncommitted / read committed / repeatable read / serializableMySQL的事务四大隔离级别我们通过MySQL看看四大隔离级别的效果读未提交(READ UNCOMMITTED)读未提交是隔离级别最低的一种,打开两个MySQL连接,分别设置隔离级别,然后两个事务交替执行,如下:可以看到,事务A可以读取到事务B未提交的数据(事实上事务B也可以读到事务A的),如果一方回滚事务,则会造成脏读等严重问题。读已提交(Read Committed)可以看到,此隔离级别可以有效解决脏读的问题,但还是无法避免不可重复读的问题可重复读(Repeatable Read)可以看到,此隔离级别可以有效解决不可重复读的问题,接下来我们看看会不会出现幻读。显然,还是有幻读的问题。串行化(Serializable)可以看到,串行化隔离最严格,可以避免幻读问题,但效率也是最低的。在选择隔离级别时,需要考虑开发的业务环境和需求,以选择最适合自己业务的隔离级别。MySQL隔离级别的实现原理待续...
2020年07月07日
707 阅读
8 评论
1 点赞
2020-06-28
Mysql delete from table 和 truncate table 的区别
truncate属于DDL即数据控制语言而非DML数据操作语言,所做操作不能回滚。truncate是删除整张表后再重建,对比delete操作逐行删除数据效率高,特别是大数据表。truncate操作会执行隐式的commit,所以不能回滚。如果会话持有活动表锁,则不能执行 truncate 操作。InnoDB或者NDB表有字段作为外键被其他表引用时,对该表执行truncate操作会失败,表内字段间的外键关联不影响此操作。truncate操作不会返回删除记录数,操作成功提示的“0 rows affected”无实际意义。只要表格式文件tablename.frm是有效的,那么即使数据或者索引文件损坏了也能通过truncate操重新创建空表。执行truncate操作后,表中如果有自增序列字段的话,自增序列会重置回初始值。即使对于MyISAM和InnoDB也是如此,它们通常不重用序列值。对分区表执行truncate操作的话,表的数据和索引文件会删除重建,但是表分区定义文件则不受影响。truncate操作不会触发ON DELETE触发器。原文参见 官方文档
2020年06月28日
887 阅读
3 评论
1 点赞