范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

MySQL的事务原理详解,一文让你搞懂

  事务(ACID)
  场景:小明向小强转账10元原子性(Atomicity)
  转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种情况。我们把这种要么全做,要么全不做的规则称之为原子性。隔离性(lsolation)
  另外一个场景:
  1. 小明向小强转账10元
  2. 小明向小红转账10元
  隔离性表示上面两个操作是不能相互影响的一致性(Consistency)
  对于上面的转账场景,一致性表示每一次转账完成后,都需要保证整个系统的余额等于所有账户的收入减去所有账户的支出。
  如果不遵循原子性,也就是如果小明向小强转账10元,但是只转了一半,小明账户少了10元,小强账户并没有增加,所以没有满足一致性了。
  同样,如果不满足隔离性,也有可能导致破坏一致性。
  所以说,数据库某些操作的原子性和隔离性都是保证一致性的一种手段,在操作执行完成后保证符合所有既定的约束则是一种结果。
  实际上我们也可以对表建立约束来保证一致性。持久性(Durability)
  对于转账的交易记录,需要永久保存。事务的概念
  我们把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称之为一个事务。事务的使用 开启事务
  BEGIN语句代表开启一个事务,后边的单词WORK可有可无。开启事务后,就可以继续写若干条语句,这些语句
  都属于刚刚开启的这个事务。
  BEGIN[WORK]mysql> BEGIN;
  Query OK, 0 rows affected (0.00 sec)
  mysql> sql...START TRANSACTION
  START TRANSACTION语句和BEGIN语句有着相同的功效,都标志着开启一个事务,比如这样:mysql> START TRANSACTION;
  Query OK, 0 rows affected (0.00 sec)
  mysql> sql...提交事务mysql> BEGIN;
  Query OK, 0 rows affected (0.00 sec)
  mysql> UPDATE account SET balance = balance - 10 WHERE id = 1;
  Query OK, 1 row affected (0.02 sec)
  Rows matched: 1 Changed: 1 Warnings: 0
  mysql> UPDATE account SET balance = balance + 10 WHERE id = 2;
  Query OK, 1 row affected (0.00 sec)
  Rows matched: 1 Changed: 1 Warnings: 0
  mysql> COMMIT;
  Query OK, 0 rows affected (0.00 sec)手动终止事务> mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE
  > account SET balance = balance - 10 WHERE id = 1; Query OK, 1 row
  > affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql>
  > UPDATE account SET balance = balance + 1 WHERE id = 2; Query OK, 1 row
  > affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql>
  > ROLLBACK; Query OK, 0 rows affected (0.00 sec)
  这里需要强调一下,ROLLBACK语句是我们程序员手动的去回滚事务时才去使用的,如果事务在执行过程中遇到了某些错误而无法继续执行的话,事务自身会自动的回滚。自动提交
  mysql> SHOW VARIABLES LIKE "autocommit";
  默认情况下,如果我们不显式的使用START TRANSACTION或者BEGIN语句开启一个事务,那么每一条语句都算是一个独立的事务,这种特性称之为事务的自动提交
  如果我们想关闭这种自动提交的功能,可以使用下边两种方法之一:
  显式的的使用START TRANSACTION或者BEGIN语句开启一个事务。这样在本次事务提交或者回
  滚前会暂时关闭掉自动提交的功能。
  把系统变量autocommit的值设置为OFF,就像这样: SET autocommit = OFF; 这样的话,我们写入的多条语句就算是属于同一个事务了,直到我们显式的写出COMMIT语句来把这个事务提交掉,或者显式的写出ROLLBACK语句来把这个事务回滚掉隐式提交
  当我们使用START TRANSACTION或者BEGIN语句开启了一个事务,或者把系统变量autocommit的值设置为OFF时,事务就不会进行自动提交,但是如果我们输入了某些语句之后就会悄悄的提交掉,就像我们输入了COMMIT语句了一样,这种因为某些特殊的语句而导致事务提交的情况称为隐式提交,这些会导致事务隐式提交的语句包括:定义或修改数据库对象的数据定义语言(Data definition language,缩写为:DDL)。所谓的数据库对象,指的就是数据库、表、视图、存储过程等等这些东西。当我们使用CREATE、ALTER、DROP等语句去修改这些所谓的数据库对象时,就会隐式的提交前边语句所属于的事务。隐式使用或修改mysql数据库中的表:当我们使用ALTER USER、CREATE USER、DROP USER、GRANT、RENAME USER、SET PASSWORD等语句时也会隐式的提交前边语句所属于的事务。事务控制或关于锁定的语句:当我们在一个事务还没提交或者回滚时就又使用STARTTRANSACTION或者BEGIN语句开启了另一个事务时,会隐式的提交上一个事务。或者当前的autocommit系统变量的值为OFF,我们手动把它调为ON时,也会隐式的提交前边语句所属的事务。或者使用LOCKTABLES、UNLOCKTABLES等关于锁定的语句也会隐式的提交前边语句所属 的事务。加载数据的语句:比如我们使用LOAD DATA语句来批量往数据库中导入数据时,也会隐式的提交前边语句所属的事务。其它的一些语句:使用ANALYZE TABLE、CACHE INDEX、CHECK TABLE、FLUSH、 LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE、RESET等语句也会隐式的提交前边语 句所属的事务。保存点
  如果你开启了一个事务,并且已经敲了很多语句,忽然发现上一条语句有点问题,你只好使用ROLLBACK语句来让数据库状态恢复到事务执行之前的样子,然后一切从头再来,总有一种一夜回到解放前的感觉。所以MYSQL提出了一个保存点(英文:savepoint)的概念,就是在事务对应的数据库语句中打几个点,我们在调用ROLLBACK语句时可以指定会滚到哪个点,而不是回到最初的原点。定义保存点的语法如下:
  SAVEPOINT 保存点名称;
  当我们想回滚到某个保存点时,可以使用下边这个语句(下边语句中的单词WORK和SAVEPOINT是可有可无的):
  ROLLBACK [WORK] TO [SAVEPOINT]保存点名称;
  不过如果ROLLBACK语句后边不跟随保存点名称的话,会直接回滚到事务执行之前的状态。
  如果我们想删除某个保存点,可以使用这个语句:
  RELEASE SAVEPOINT保存点名称;隔离性详解--修改隔离级别
  mysql> set session transaction isolation level read uncommitted;
  --查看隔离级别
  mysql> select @@tx_isolation;读已提交(READ UNCOMMITTED)
  一个事务可以读到其他事务还没有提交的数据,会出现脏读。
  一个事务读到了另一个未提交事务修改过的数据,这就是脏读。读未提交(READ COMMITTED)
  一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,会出现不可重复读、幻读。
  如果一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来,这就是幻读。可重复读(REPEATABLEREAD)
  一个事务第一次读过某条记录后,即使其他事务修改了该记录的值并且提交,该事务之后再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据,这就是可重复读,这种隔离级别解决了不可重复,但是还是会出现幻读。串行化(SERIALIZABLE)
  以上3种隔离级别都允许对同一条记录同时进行读-读、读-写、写-读的并发操作,如果我们不允许读-写、写-读的并发操作,可以使用SERIALIZABLE隔离级别,这种隔离基金因为对同一条记录的操作都是串行的,所以不会出现脏读、幻读等现象。总结READ UNCOMMITTED隔离级别下,可能发生脏读脏读、**不可重复读、、幻读**问题。READCOMMITTED隔离级别下,可能发生不可重复读 不可重复读和**幻读问题,但是不会发生 问题,但是不会发生脏读**问题。REPEATABLE READ隔离级别下,可能发生幻读幻读问题,不会发生脏读脏读和**不可重复读**的题。SERIALIZABLE隔离级别下,各种问题都不可以发生。
  注意:这四种隔离级别是SQL的标准定义,不同的数据库会有不同的实现,特别需要注意的是MySQL在在REPEATABLE READ隔离级别下,是可以禁止幻读问题的发生的 隔离级别下,是可以禁止幻读问题的发生的。版本链
  对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,我们创建的表中有主键或者非NULL唯一键时都不会包含row_id列):trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列。roll_pointer:每次对某条记录进行改动时,这个隐藏列会存一个指针,可以通过这个指针找到该记 录修改前的信息。Readview
  对于使用READ UNCOMMITTED隔离级别的事务来说,直接读取记录的最新版本就好了,对于使用SERIALIZABLE隔离级别的事务来说,使用加锁的方式来访问记录。对于使用READ COMMITTED和REPEATABLE READ隔离级别的事务来说,就需要用到我们上边所说的版本链了,核心问题就是:需要判断一下版本链中的哪个版本是当前事务可见的。
  ReadView中主要包含4个比较重要的内容:
  1. m_ids:表示在生成ReadView时当前系统中活跃的读写事务的事务id列表。
  2. min_trx_id:表示在生成ReadView时当前系统中活跃的读写事务中最小的事务id,也就是m_ids中的最小值。
  3. max_trx_id:表示生成ReadView时系统中应该分配给下一个事务的id值。
  4. creator_trx_id:表示生成该ReadView的事务的事务id。
  注意:max_trx_id并不是m_ids中的最大值,事务id是递增分配的。比方说现在有id为1,2,3这三个事务,之后id为3的事务提交了。那么一个新的读事务在生成ReadView时,m_ids就包括1和2,min_trx_id的值就是1,max_trx_id的值就是4。
  有了这个ReadView,这样在访问某条记录时,只需要按照下边的步骤判断记录的某个版本是否可见:如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。如果被访问版本的trx_id属性值小于ReadView中的min_trx_id值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问。如果被访问版本的trx_id属性值大于ReadView中的max_trx_id值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本不可以被当前事务访问。如果被访问版本的trx_id属性值在ReadView的min_trx_id和max_trx_id之间,那就需要判断一下trx_id属性值是不是在m_ids列表中,如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问;如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版 本可以被访问READ COMMITTED的实现方式
  每次读取数据前都生成一个ReadView
  REPEATABLE READ的实现方式
  在第一次读取数据时生成一个ReadViewMVCC总结
  MVCC(Multi-Version Concurrency Control ,多版本并发控制)指的就是在使用READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程。可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。READ COMMITTD、REPEATABLE READ这两个隔离级别的一个很大不同就是:生成ReadView的时机不同,READ COMMITTD在每一次进行普通SELECT操作前都会生成一个ReadView,而REPEATABLE READ只在第一次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复使用这个ReadView就好了。
  至此MySQL事务就给大家讲完了,了解更多JAVA知识及资料可关注微信公众号"老周扯IT"

2020工博会隆重开幕!工业自动化展区的这些亮点是你想要的吗第22届中国工博会今日隆重开幕啦!本届展会以智能互联赋能产业新发展为主题,汇集了2600家参展商,展示最新产品技术以及成果。同时众多专业参会观众也将集聚一堂,以寻求商机和项目合作。vivoX50Pro亚历山大王版开售仅1000台2020年9月8日,vivo官方微博正式宣布vivoX50Proalexanderwang限定版手机将于当日10点正式开启全平台预售。据悉,vivoX50Proalexanderw是搅局者,还是来陪跑,vivoWATCH体验评测还记得在vivoNEX3发布会之前,就有人传vivo可能会发布可穿戴设备,结果是vivo在发布会上带来了首款vivoTWS耳机,这也是vivo在打造生态圈的第一步。而在焦急的等待了减少人员80操作量,全自动橡胶压入机为何能做到这样?制造业作为国民经济的主要支柱之一,涉及到人们生活企业运行等方方面面,其所涵盖的分支产业数不胜数。拿橡胶和塑料制造来说,橡胶塑料制品不仅广泛应用于人们日常生活一些塑料包装,在一些石油华南国际工业博览会,智能制造,人工智能这里全都有在经过一次延期后,华南国际工业博览会于10月12日15日将在深圳国际会展中心(新馆)举行,展会以工业引领,智享未来为主题,目的是促进工业制造智能化,智能化工业产业化。这次展会,触想Redmi小爱触屏音箱Pro8英寸配置升级,内置大电池今日,Redmi小爱触屏音箱Pro8英寸正式登陆小米官网,这也是小米首款内置电池的小爱触屏音箱,内置4700mAh大容量锂电池,拥有约4。5小时的长续航,并且在机身背后增加了提手设断网了用全智能故障检修设备就能快速恢复?随着现代城市化进程的不断加速,网络电力产业得以飞速发展,同时人们对于通信质量的要求也越来越高。基于通信行业迅速发展的需求,通信电缆作为保证正常通信的重要载体,对其定期检查维护,是保大大小小的配电站中,智能机柜显示设备有啥作用?电力作为日常生活工作企业运营制造生产等方方面面的基础条件之一,占据重要地位。而为保障各方面的正常供电,大大小小的配电站是不可少的,与之关联的电力机房,到电力机柜变频器等,也成为电力稳定猪肉价格,智慧养猪定制解决方案或许才是未来养猪作为畜牧业主要产业之一,是国民经济发展的重要组成部分。同时,我国作为世界上最大的猪肉生产国和消费国,猪肉产量近五年来一直稳居全球首位。在去年,供不应求的市场失衡,导致猪肉价格大首款即高端,vivoWATCH全系1299,我如何拒绝?前几年可穿戴设备还主要在围绕智能手环作为主力输出,但随着消费者对手机与可穿戴设备之间的交互需求越来越高,智能手表已不是某果一家独大。作为vivo首款可穿戴设备,vivoWATCH秉深圳地铁610号线开通!但轨道交通这些智能显示是怎么回事?日前,深圳地铁610号线正式运营!双线同时开通,不仅显现了深圳的雄厚实力,作为贯彻生态和智慧设计理念的610号线,智慧车窗华为站全5G网络等双线亮点,更是频频登上各媒体头条,成为网
如果生活在智能化房屋,你想要什么样的智能家居用品?我们现在的生活正在迈向智能化,但是智能化的不够彻底。洗碗机,我希望能有更好的清洁能力,和更安全的更好的杀菌效果。扫地机,我希望它能有更好的扫描能力和范围,能更智能的避开某些物品,清想买台智能电视,有什么好的推荐?据我了解海信,長虹,康佳,创维TcL都有相应的枝术支持。在性格比上较高,其它国产品牌也不错,而在智能方面外国品牌还落后一步。我看海信电视就不错,也有说小米的好,总之我认为这些牌子都疑似三星GalaxyFlexNote智能机专利曝光SPen设有独特收纳位在上月发布了GalaxyZFold3与GalaxyZFlip3折叠屏新机之后,该公司似乎已经彻底将传统的GalaxyNote21系列打入冷宫。然而2020年10月29日,这家韩国科小米准备推出新款神秘智能手机Civi中国科技巨头小米准备在9月27日在中国发布与Civi智能手机有关的例行公告。在小米公司的网店里出现了一个带有手机盒外观的横幅,旁边写有一场天生好看的科技发布会广告语。观察家认为,这哪些智能家电用品值得买?真心推荐这6种,方便实用,不是假智能如今有很多智能家电,其实是打着智能的旗号,做的噱头,实际上真正用起来体验并不佳,最后只好忍下这口气,但是已经白白浪费了买这些家电的钱。那么,到底有哪些智能家电用品是真正实用值得买的股票与基金哪个风险大?毋庸置疑,当然是股票的波动大收益高,风险自然比基金要大很多!从概率学上来说买一只股票,涨跌的概率都是50而一个指数型基金,持有十几只股票都算少的,我们算少一点,以包含五只股票的基金vivoX70系列值不值得入手?首批评价已出炉,差评原因很真实上周,vivo发布了最新的vivoX70系列旗舰手机,其在外观配置等方面都给我们带来了惊喜,而代表vivo高端新门面的vivoX70Pro更是被誉为下半年最强安卓旗舰。目前,这款手华为nova9系列曝光起售价或将低于3000元9月18日,有数码博主爆料,发布在即的华为nova9系列起售价将不到3000元。华为nova9系列将于9月23日正式发布。根据相关消息称,华为nova9将搭载一块6。57英寸的双曲苹果A15芯片跑分出炉满血版Pro系列独享!区别到底大不大?苹果iPhone13系列如期而至,相比起11到12系列的更新幅度,今年苹果可以说是挤出了更多的牙膏,部分如刘海等细节的升级,还是蛮不错的。而大家关注的A15仿生芯片,则依然拥有着绝国行港版美版的iPhone13系列,价格相差多少?一起来看看吧苹果最新发布的iPhone13系列手机,相信大家最关心的一定是价格,国行的价格大家已经知道了,今天畅玩君特总结了各主要地区的iPhone13系列的价格,主要为国行,港版,美版,仅供redmi中低端系列新机入网荣耀X20Max大屏标配22。5W充电器在上个月小米发布了小米MIX4新机后,Redmi这边的新机研发工作也在有条不紊的进行中,近日据国内知名爆料人士数码闲聊站在社交媒体上透露,小米代号为K16x的系列新机近期正式入网,