新闻中心

多个事务合并sql

多个事务合并sql

事务提交大量sql与合并提交大量sql效率对比_thy专栏-CSDN博客_一个事务大量sql

扫一扫,分享内容

打赏作者

thy38

你的鼓励将是我创作的最大动力

您的余额不足,请更换扫码支付或

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

MySQL-SQL性能优化之最有效的办法合并+事务+有序数据进行INSERT操作效率最快。..._zhenjw-CSDN博客

对于一些数据量较大的系统,

面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表

,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久。因此,优化数据库插入性能是很有意义的。最有效的办法是:合并+事务+有序数据 进行INSERT操作效率最快。

经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。

1. 一条SQL语句插入多条数据。

常用的插入语句如:

修改成:

 

修改后的插入操作能够提高程序的插入效率。这里第二种SQL执行效率高的主要原因是合并后日志量(MySQL的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率。通过合并SQL语句,同时也能减少SQL语句解析的次数,减少网络传输的IO。

这里提供一些测试对比数据,分别是进行单条数据的导入与转化成一条SQL语句进行导入,分别测试1百、1千、1万条数据记录。

 

2. 在事务中进行插入处理。

把插入修改成:

使用事务可以提高数据的插入效率,这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交操作。

这里也提供了测试对比,分别是不使用事务与使用事务在记录数为1百、1千、1万的情况。

3. 数据有序插入。

数据有序的插入是指插入记录在主键上是有序排列,例如datetime是记录的主键:

 

修改成:

 

由于数据库插入时,需要维护索引数据,无序的记录会增大维护索引的成本。我们可以参照innodb使用的B+tree索引,如果每次插入记录都在索引的最后面,索引的定位效率很高,并且对索引调整较小;如果插入的记录在索引中间,需要B+tree进行分裂合并等处理,会消耗比较多计算资源,并且插入记录的索引定位效率会下降,数据量较大时会有频繁的磁盘操作。

下面提供随机数据与顺序数据的性能对比,分别是记录为1百、1千、1万、10万、100万。

从测试结果来看,该优化方法的性能有所提高,但是提高并不是很明显。

性能综合测试:

这里提供了同时使用上面三种方法进行INSERT效率优化的测试。

从测试结果可以看到,合并数据+事务的方法在较小数据量时,性能提高是很明显的,数据量较大时(1千万以上),性能会急剧下降,这是由于此时数据量超过了innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快。而使用合并数据+事务+有序数据的方式在数据量达到千万级以上表现依旧是良好,在数据量较大时,有序数据索引定位较为方便,不需要频繁对磁盘进行读写操作,所以可以维持较高的性能。

注意事项:

1. SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M。

2. 事务需要控制大小,事务太大可能会影响执行的效率。MySQL有innodb_log_buffer_size配置项,超过这个值会把innodb的数据刷到磁盘中,这时,效率会有所下降。所以比较好的做法是,在数据达到这个这个值前进行事务提交。

扫一扫,分享内容

打赏作者

iteye_10343

你的鼓励将是我创作的最大动力

您的余额不足,请更换扫码支付或

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

SQL Server多个数据库合并_SAP阿狸-CSDN博客_数据库合并

1、创建两个数据库A_TEST,B_TEST。

2、将数据库A合并到数据库B。选中数据库,右键——任务——导出数据。

3、转到导出向导,选择下一步。

4、输入服务器名称,选择身份验证(默认Windows),选择导出的数据库名。然后“下一步”。

5、输入目标服务器名称(不跨服务器:服务器名称和上一步导出时的一致;跨服务器:需要输入服务名称),选择要合并的目标数据库B_TEST。然后“下一步”

6、选择“复制一个或多个表或者视图数据”。然后下一步。

7、选中要复制目标数据库的数据源。一般全选中。

8、选择“立即运行”,然后“下一步”

9、已存的的数据会进行“追加”,不存在的数据,将会新建。点击“完成”。实现数据库A_TEST和B_TEST的合并。

10、合并成功报告。

11、最终合并结果。

扫一扫,分享内容

打赏作者

wtxhai

你的鼓励将是我最大的动力!

您的余额不足,请更换扫码支付或

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

MySQL中将多个select语句的查询结果合并一起的方法 - 行业资讯 - 亿速云

分享文章到朋友圈

下文给大家带来有关

中将多个select语句的查询结果合并一起的方法内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完MySQL中将多个select语句的查询结果合并一起的方法你一定会有所收获。

1. 背景

   * 全并查询结果是将多个 select 语句的查询结果合并到一起。

   * 参与合并的结果集需要字段统一。

   * 字段可以用空字符串''代替。

2. 合并查询结果实战 [ users1 and users2 ]

   * 查看 users1 表和 users2 表结构

   * 查看 users1 表和 users2 表数据

    users1和users2表中有相同字段 tom

   * union 合并并去重

   * union all 只全并不去重

   * 查看union  性能分析

      [ 使用了临时表 ]

   * 查看union all 性能分析

     [ 未使用临时表 ]

3. union 与 union all 总结

   * union 相对于 union all多了一步去重操作,此操作会创建临时表,降低性能。

   * 当两边结果集数据相对都确定了唯一性,推荐使用union all。

4. 总结

以需求驱动技术,技术本身没有优略之分,只有业务之分。

对于上文关于MySQL中将多个select语句的查询结果合并一起的方法,大家觉得是自己想要的吗?如果想要了解更多相关,可以继续关注我们的行业资讯板块。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

红包可用于(云服务器、高防服务器、裸金属服务器、高防IP、云数据库、CDN加速)购买和续费

Copyright © Yisu Cloud Ltd. All Rights Reserved. 2018 版权所有

【译】第六篇 Replication:合并复制-发布 - Uest - 博客园

本篇文章是

的第六篇,详细内容请参考

合并复制,类似于事务复制,包括一个发布服务器,一个分发服务器和一个或多个订阅服务器。每一个发布服务器上可以定义多个发布。你也可以同时在同一台发布服务器上定义合并发布、事务发布和快照发布。同事务复制,每一个发布所包含的项目需要是单一数据库中的对象。不同的发布可以定义在不同的数据库上。一个项目可以被多个发布使用。All publications on a publisher, independent of their type, have to use the same distributor.

上面这一段和第三篇开篇介绍的事务复制中的发布服务器很类似。两者都是发布-订阅模式,并将数据从发布服务器移动到订阅服务器。相同之处也是在那里结束。

合并复制允许客户端(订阅服务器)与主服务器(发布服务器)断开连接。每一次重新连接时,发布服务器上的所有变更会拷贝到订阅服务器上,反之亦然。允许真正的同步,并且断开时不限制工作。

事务复制利用SQL Server事务日志将数据变更传送到订阅服务器。相比之下,合并复制在每次同步的过程中查看已发布表的数据。That helps to reduce the storage requirements on the each server while being disconnected from the rest of the replication setup. But it also introduces some storage overhead and inflexibility.第八篇将详细介绍它是如何工作的。

本篇的剩余篇幅会介绍如何配置一个合并发布。假设你已经遵循第二篇配置好分发服务器,并且已经将发布服务器连接到分发服务器。

只要sysadmin固定服务器角色成员为复制启用了数据库,数据库中任何db_owner固定数据库角色的成员可以定义一个发布。为合并复制启用数据库,对象资源管理器下连接到发布服务器,右击复制,选择"发布服务器属性",如图6.1所示

图6.1 发布服务器属性

在打开的发布服务器属性对话框,选择"发布数据库"页,然后勾选对应数据库的合并列复制框,如图6.2所示

图6.2 为合并复制启用发布数据库

在你为合并复制启用数据库后,你可以参照以下步骤创建一个发布。首先展开发布服务器实例(计划发布的数据库所在的实例)下的复制文件夹,右击"本地发布"子文件夹,并选择"新建发布…",如图6.3所示

图6.3 新建发布

新建发布向导被打开,第一个需要做选择的是发布数据库页面(图6.4)

图6.4 选择发布数据库

选择你想要发布的数据库,然后到下一个页面。下一个页面允许你选择发布类型,如图6.5所示

图6.5 选择合并发布

这一篇是关于合并复制,因此这里选择"合并发布"。一直到这里,这些步骤和事务复制的步骤是非常相似的。然而,在配置事务复制中却没有下面这个页面。它允许你选择"订阅服务器类型",如图6.6所示

图6.6 订阅服务器类型

这里你可以为发布指定订阅服务器将使用的SQL Server版本。你可以选择一个或多个版本。除了"SQL Server2008"其他的选择都有功能上的限制。详细内容请参考Books Online.

如果你的发布数据库已经包含一个合并发布,"订阅服务器类型"页面的选项会显著减少。同一数据库下的所有合并发布需要使用相同的订阅服务器类型。图6.7显示了存在另一个合并发布的例子

图6.7 已存在合并发布时的订阅服器类型

订阅服务器类型确定好后,下一步是选择发布的数据库对象。在事务复制和合并复制中每一个发布的对象被称做项目。

图6.8 项目

图6.8显示了向导的"项目"页面。你可以选择表、函数、视图、索引视图、存储过程和同义词来发布。In merge replication most of these are "schema only" articles.这意味着数据库对象的定义会被复制到订阅服务器(其他的不会)。比如事务复制允许复制存储过程的执行,但在合并复制中这是不可能的。唯一允许复制除了定义之外的项目类型是表。

这种限制的原因是合并复制的工作机制。事务复制读取事务日志,因此能访问数据库中按顺序发生的每一个动作的详细清单。

合并复制依赖于一系列的触发器,因此被限制只能捕获数据(架构)变更。虽然这种方法有局限性,但部分可用项目类型变得更灵活。比如,你可以将没有主键的表进行合并复制,这在事务复制中是不可能的。更多关于合并复制的内部工作机制会在第八篇讲述。

当你选择一张表作为项目,在"项目属性"按钮下面会出现一个额外的复选框。它允许你选择"突出显示的表仅用于下载"。仅用于下载意味着不能在订阅服务器变更表中的数据。

你应该为那些包含数据但不能在订阅服务器进行变更的表选择这个选项。这个选项会引起在发布服务器上的数据收集减少,因为不再需要解决冲突问题。这对发布服务器上的性能和空间需求有巨大的影响。

这个复选框是"项目属性"中的一个属性的替代方法。这个选项控制表项目的双向性。它被称作同步方向(图6.9)。你可以通过点击图6.8中的项目属性打开。

对于"同步方向",你可以选择下面三个选项:

->双向

->仅下载到订阅服务器,禁止订阅服务器更改

->仅下载到订阅服务器,允许订阅服务器更改

"突出显示的表仅用于下载"复选框允许你在前两个选项中选择。如果你手动选择了第三项——允许订阅服务器更改,但不会传回到发布服务器而且可能被重写。

图6.9 同步方向

The fact that there is a single checkbox alternative for this option shows the importance of selecting the appropriate setting for your articles.当你点击项目属性按钮你可以选择为突出显示的项目设置选项,或者你也可以为与突出显示的项目同类型的所有项目设置选项。每个对象类型可用的选项列表参考Books Online.

项目属性对话框的第二个页签如图6.10所示。It allows you to specify how conflicts should be handled for each article by selecting a resolver.

图6.10 冲突解决程序

类似事务复制,你可以选择发布整张表,或者发布部分列。为了选择单独的列,通过点击表名前面的+号,展开列列表。

图6.11 筛选列

下一个页面是警告。这里可能会显示多条警告,在配置合并复制你最可能看到如图6.12所示警告

图6.12 项目问题

这条警告说明:所有合并项目都必须包含带有唯一索引的unipueidentifier列和ROWGUIDCOL属性。如果表中没有unipueidentifier列,SQL Server会自动添加该列。这个变更可能会打乱现有访问此表的代码。它还会增加表的大小(每行至少16bytes)。

如果你删除合并复制,项目中自动添加的unipueidentifier列也会被自动移除。这将打乱那些复制创建后,依赖unipueidentifier列所写的代码。由于这些原因,最好在配置合并复制前手动添加unipueidentifier列。这样当他们删除时你就可以完全控制。

下一个页面如图6.13所示。这里针对表项目你可以添加一个行筛选。只有当发布中添加有表项目时才会显示这个页面。

图6.13 筛选表行

一个行筛选或者水平筛选类似于查询语句,如图6.14所示

图6.14 水平筛选

接下来两个页面(图6.15、图6.16),deal with the snapshot agent and are almost identical to their counter parts on transactional replication. There are two differences that stand out:

->1、对于合并复制,向导建议立即创建快照,并且每14天创建一个新快照。对于事务复制两个复选框默认都没有勾选。合并复制主要针对客户端(订阅服务器)经常与发布服务器断开连接,重新同步的可能性远远高于事务订阅。为了在需要的时候有一个较新的可用快照,有必要让它定期生成一个新的快照。这就避免了在高峰期运行快照代理。查看第八篇的"快照代理"章节,了解更多的背景信息。

->2、合并复制不需要分发代理。因此你在代理安全页面只能看到快照代理。

你提供给快照代理的凭证需要与第三篇事务复制中的快照代理帐户有相同的访问权限。

图6.15 快照代理

图6.16 代理安全性

向导剩余页面和事务复制是相同的。如图6.17、图6.18、图6.19所示。这里你可以选择让向导执行配置或者是生成脚本文件。你需要为发布设定一个名称(MyFirstMergePublication)。

Finally you get to watch the progress of either executing or scripting the necessary changes.

图6.17 向导操作

图6.18 设置发布名称

图6.19 创建发布

类似事务复制,在配置合并复制时可能会出现各种问题。合并复制最常见的问题也是帐户没有合适的权限。如果你遇到这样的问题,你应该检查所有的帐户已经授予正确的权限。故障排除的详细内容请查看第十篇。你也可以参考第三篇提及的"潜在问题",大部分的建议同样适用于合并复制。

这一篇介绍了配置合并发布。显示了如何创建发布并添加项目。罗列了不同类型的项目并讨论了它们的同步选项。同时指出与配置事务发布的不同之处。

类似事务复制,在配置好合并发布后也看不到很多东西。要想看到发生了什么,至少需要有一个订阅。下一篇我们将讨论如何配置合并订阅。

Mysql批量插入事务插入性能对比_满天星-CSDN博客_mysql 事务插入

Mysql批量插入事务插入性能对比。对于一些数据量较大的

面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,可能每天花费在数据导入上的时间就会长达几个小时之久。因此,优化数据库插入性能是很有意义的。

网络上的牛人很多,总会有一些手段可以提高insert效率,大家跟我一起分享一下吧:

1. 一条SQL语句插入多条数据。

我们常用的插入语句大都是一条一个insert,如:

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)

VALUES ('0', 'userid_0', 'content_0', 0);

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)

VALUES ('1', 'userid_1', 'content_1', 1); 现在我们将它修改成:

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)

VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1);

【数据对比】

下面是网上牛人提供一些测试对比数据,分别是进行单条数据的导入与转化成一条SQL语句进行导入,分别测试1百、1千、1万条数据记录。通过对比,可以发现修改后的插入操作能够提高程序的插入效率。

【缘由分析】

这里第二种SQL执行效率高的主要原因是合并后日志量(MySQL的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率。通过合并SQL语句,同时也能减少SQL语句解析的次数,减少网络传输的IO。

2. 在事务中进行插入处理。

在操作数据的时候,事务也是很常用的。现在我们把上面的插入语句修改成:

START TRANSACTION;

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)

VALUES ('0', 'userid_0', 'content_0', 0);

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)

VALUES ('1', 'userid_1', 'content_1', 1);

...

COMMIT;

【数据对比】

这里也提供了测试对比,分别是不使用事务与使用事务在记录数为1百、1千、1万的情况。亦发现数据的插入效率提高了。

【缘由分析】

这是因为进行一个INSERT操作时,

内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交操作。

3. 数据有序插入。

数据有序的插入是指插入记录在主键上是有序排列,例如datetime是记录的主键:

原始插入语句如下:

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)

VALUES ('1', 'userid_1', 'content_1', 1);

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)

VALUES ('0', 'userid_0', 'content_0', 0);

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)

VALUES ('2', 'userid_2', 'content_2',2); 修改成:

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)

VALUES ('0', 'userid_0', 'content_0', 0);

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)

VALUES ('1', 'userid_1', 'content_1', 1);

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)

VALUES ('2', 'userid_2', 'content_2',2);

【数据对比】

下面提供随机数据与顺序数据的性能对比,分别是记录为1百、1千、1万、10万、100万。从测试结果来看,该优化方法的性能有所提高,但是提高并不是很明显。

【缘由分析】

由于数据库插入时,需要维护索引数据,无序的记录会增大维护索引的成本。我们可以参照innodb使用的B+Tree 索引,如果每次插入记录都在索引的最后面,索引的定位效率很高,并且对索引调整较小;如果插入的记录在索引中间,需要B+tree进行分裂合并等处理,会消耗比较多计算资源,并且插入记录的索引定位效率会下降,数据量较大时会有频繁的磁盘操作。

性能综合测试:

这里提供了同时使用上面三种方法进行INSERT效率优化的测试。

从测试结果可以看到,合并数据+事务的方法在较小数据量时,性能提高是很明显的,数据量较大时(1千万以上),性能会急剧下降,这是由于此时数据量超过了innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快。而使用合并数据+事务+有序数据的方式在数据量达到千万级以上表现依旧是良好,在数据量较大时,有序数据索引定位较为方便,不需要频繁对磁盘进行读写操作,所以可以维持较高的性能。

注意事项:

SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M。事务需要控制大小,事务太大可能会影响执行的效率。MySQL有innodb_log_buffer_size配置项,超过这个值会把innodb的数据刷到磁盘中,这时,效率会有所下降。所以比较好的做法是,在数据达到这个这个值前进行事务提交。

扫一扫,分享内容

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法_levae1024的博客-CSDN博客_同一个类中一个方法调用另一个方法

   Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.  结果造成开发人员在设计                                                               事务方法时束手束脚,生怕一不小心就踩到地雷。 

  其实这是不认识Spring事务传播机制而造成的误解,Spring对事务控制的支持统一在TransactionDefinition类中描述,该类有以下   几个重要的接口方法:

除了事务的传播行为外,事务的其他特性Spring是借助底层资源的功能来完成的,Spring无非只充当个代理的角色。但是事务的传播行为却是Spring凭借自身的框架提供的功能 ;

   所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring支持以下7种事务传播行为

 例子中,有两方法,一个有@Transational注解,一个没有。如果调用了有注解的addPerson()方法,会启动一个Transaction;如果调用updatePersonByPhoneNo(),因为它内部调用了有注解的addPerson(),如果你以为系统也会为它启动一个Transaction,那就错了,实际上是没有的 

spring 在扫描bean的时候会扫描方法上是否包含@Transactional注解,如果包含,spring会为这个bean动态地生成一个子类(即代理类,proxy),代理类是继承原来那个bean的。此时,当这个有注解的方法被调用的时候,实际上是由代理类来调用的,代理类在调用之前就会启动transaction。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个bean,所以就不会启动transaction,我们看到的现象就是@Transactional注解无效。

 

为什么一个方法a()调用同一个类中另外一个方法b()的时候,b()不是通过代理类来调用的呢?可以看下面的例子(为了简化,用伪代码表示):

当我们调用A的bean的a()方法的时候,也是被proxy$A拦截,执行proxy$A.a()(标记3),然而,由以上代码可知,这时候它调用的是objectA.a(),也就是由原来的bean来调用a()方法了,所以代码跑到了“标记1”。由此可见,“标记2”并没有被执行到,所以startTransaction()方法也没有运行。

 

.

动态代理最终都是要调用原始对象的,而原始对象在去调用方法时,是不会再触发代理了!

2. Spring的事务管理是通过AOP实现的,其AOP的实现对于非final类是通过cglib这种方式,即生成当前类的一个子类作为代理类,然后在调用其下的方法时,会判断这个方法有没有@Transactional注解,如果有的话,则通过动态代理实现事务管理(拦截方法调用,执行事务等切面)。当b()中调用a()时,发现b()上并没有@Transactional注解,所以整个AOP代理过程(事务管理)不会发生。

附 使用AOP 代理后的方法调用执行流程:

参考文献: 

                

                

               

               

               

扫一扫,分享内容

打赏作者

蜗行牛步1024

持续分享持续精进

您的余额不足,请更换扫码支付或

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

百度知道 - 信息提示

 | 

 | 

京ICP证030173号-1   京网文【2013】0934-983号     ©2022Baidu  

 | 

 

Spring中,多个service发生嵌套,事务是怎么样的? - 牛初九 - 博客园

最近在项目中发现了一则报错:“org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only”。根据报错信息来看是spring框架中的事务管理报错:事务回滚了,因为它被标记为回滚状态。

多层嵌套事务中,如果使用了默认的事务传播方式,当内层事务抛出异常,外层事务捕捉并正常执行完毕时,就会报出rollback-only异常。

spring框架是使用AOP的方式来管理事务,如果一个被事务管理的方法正常执行完毕,方法结束时spring会将方法中的sql进行提交。如果方法执行过程中出现异常,则回滚。spring框架的默认事务传播方式是PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。

在项目中,一般我们都会使用默认的传播方式,这样无论外层事务和内层事务任何一个出现异常,那么所有的sql都不会执行。在嵌套事务场景中,内层事务的sql和外层事务的sql会在外层事务结束时进行提交或回滚。如果内层事务抛出异常e,在内层事务结束时,spring会把事务标记为“rollback-only”。这时如果外层事务捕捉了异常e,那么外层事务方法还会继续执行代码,直到外层事务也结束时,spring发现事务已经被标记为“rollback-only”,但方法却正常执行完毕了,这时spring就会抛出

代码示例如下:

当调用

时,就会报出

异常。

附:事务传播方式

mysql alter add 多列_mysql alter table修改表结构添加多个字段的几个写法_TsingGuo 郭卿的博客-CSDN博客

本文介绍mysql中,add column添加多字段的几个写法。

分开写多个 alter table

听起来好像是多此一举的介绍,有时需要给相邻字段不同的修改,全都分开写,也不失为不容易出错的写法。

ALTER TABLE employee ADD email_address varchar(50);

ALTER TABLE employee MODIFY address varchar(30);

ALTER TABLE employee ADD COLUMN last_name varchar(30);

合并写在一起

具体看下面的例子,这几种写法都可以。

可以不带column关键字。

-- 创建测试表

create table test_alter (id int);

-- 只写add,没有 column 关键字, 增加的多个字段内容在大括号中

alter table test_alter add (user_name char(5), address varchar(30));

-- 带 column 关键字, 增加的多个字段内容在大括号中

alter table test_alter add column (user_name char(5), address varchar(30));

-- 分开写多个add,没有 column 关键字, 没有大括号

alter table test_alter add user_name char(5), add address varchar(30);

-- 分开写多个add,带有 column 关键字, 没有大括号

alter table test_alter add column user_name char(5), add column address varchar(30);

-- 小扩展,分开写多个除了写add,也可以写modify等其他修改

alter table test_alter add user_name char(5), modify address varchar(15);

扫一扫,分享内容

打赏作者

TsingGuo 郭卿

你的鼓励将是我创作的最大动力

您的余额不足,请更换扫码支付或

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。