数据库setautocommit如何实现自动提交? (数据库setautocommit)

作为一名数据库开发者,我们经常需要进行数据操作,涉及到增删改查等多种操作。在我们进行这些操作的过程中,为了更大限度的保证数据的完整性和安全性,我们往往需要使用事务来进行操作。事务可以将一组数据操作视为一个整体,在保证数据的完整性和安全性的同时让操作更加高效满足业务需求。

事务机制就涉及到了操作的提交和回滚。数据库提供了默认的提交操作,但是在事务中更加灵活的是由用户自己控制提交的时机。而在实际开发中,我们经常会遇到忘记手动提交的情况,这时候就需要用到setautocommit,来进行自动提交。

setautocommit是mysql中一个很重要的概念,主要用作全局参数,此参数控制着mysql数据库的事务“自动提交”功能,也就是说用户可以通过“set autocommit = false;”的方法,关掉mysql数据库自动提交的功能,以便进行更加自由、灵活的事务处理。当我们需要提交数据时,只需手动调用commit命令即可。如果出现错误,也可以使用rollback命令回滚数据。

那么setautocommit的具体实现是什么呢?在mysql数据库中,事务的提交有两种方式:自动提交和手动提交。自动提交是指,当执行一条sql语句时,如果设置的自动提交开关“set autocommit = true;”,那么就会自动提交,即会自动将本次更新、删除等操作的结果做一个提交操作;而手动提交,则是在一段程序执行完毕之后,调用commit命令提交事务。

当我们使用自动提交时,如果代码中发生逻辑异常(如页面抛出异常),导致自动提交失败,就会造成保持数据库中的事务状态不一致,从而导致程序出现bug。这时,我们就必须使用手动提交,来确保事务的正确执行。

setautocommit可以实现哪些功能呢?在mysql中,如果修改这个参数的值,将会对连接的整个生命周期生效,而这个连接的状态将会受到有关操作的影响。

1. 关闭自动提交,手动提交事务,减轻锁带来的跨事务的资源冲突:当数据库默认使用自动提交时,往往一旦发生写冲突,就可能造成阻塞。而手动提交,则可以对事务进行更规范的控制,提高事务并发度,从而提高事务的效率和执行能力。

2. 避免由于大事务等原因造成的锁定超时封锁:如果使用单一大事务,可能会持有所有锁,并且在锁等待数据准备和超时期间,将数据库锁住,从而导致其他进程阻塞。而将事务控制在较小的范围内,可以最小化锁定的时间,从而避免数据库被锁住的情况。

3. 避免由于表操作失误情况造成事务未提交:当我们总是使用自动提交来执行数据库操作时,很容易忘记手动提交,从而导致程序出现错误。而手动提交可以提高事务的可控性,避免出现程序错误。

setautocommit可以实现自动提交,避免因忘记手动提交而造成的程序出错,同时也可以提高数据库的执行效率。在实际开发中,我们可以通过合理的使用setautocommit,来实现更加规范高效的数据库操作,从而提高开发效率和执行能力。

相关问题拓展阅读:

JDBC连接Oracle数据库之十大技巧

java数据库连接(jdbc)api是一系备携列能够让java编程人员访问数据库的接口,各个开发商的接口并不完全相同。在使用多年的oracle公司的jdbc后,我积累了许多技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能。

1、在客户端软件开发中使用thin驱动程序

在开发java软件方面,oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择oci驱动程序或thin驱动程序。oci驱动程序利用java本地化接口(jni),通过oracle客户端软件与数据库进行通讯。thin驱动程序是纯java驱动程序,它直接与数据库进行通讯。为了获得更高的性能,oracle建议在客户端软件的开发中使用oci驱动程序,这似乎是正确的。但我建议使用thin驱动程序,因为通过多次测试发现,在通常情况下,thin驱动程序的性能都超过了oci驱动程序。

2、关闭自动提交功能,提高系统性能

在之一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的connection类的setautocommit()方法关闭自动提交功能,如下所示:

conn.setautocommit(false);

值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用connection类的commit()和rollback()方法来人工的方式对事务进行管理。

3、在动态sql或有时间限制的命令中使用statement对象

在执行sql命令时,我们有二种选择:可以使用preparedstatement对象,也可以使用statement对象。无论多少次地使用同一个sql命令,preparedstatement都只对它解析和编译一次。当使用statement对象轮竖时,每次执行一个sql命令时,都会对它进行解析和编译。这可能会使你认为,使用preparedstatement对象比使用statement对象的速度更快。然而,我进行的测试表明,在客户端软件中,情腊滚大况并非如此。因此,在有时间限制的sql操作中,除非成批地处理sql命令,我们应当考虑使用statement对象。

此外,使用statement对象也使得编写动态sql命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的sql命令。因此,我认为,statement对象可以使动态sql命令的创建和执行变得更加简单。



4、利用helper函数对动态sql命令进行格式化

在创建使用statement对象执行的动态sql命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字o’reilly插入表中的sql命令,则必须使用二个相连的“””号替换o’reilly中的“’”号。完成这些工作的更好的方法是创建一个完成替换操作的helper方法,然后在连接字符串心服用公式表达一个sql命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个date型的值,然后让它输出基于oracle的to_date()函数的字符串表达式。

5、利用preparedstatement对象提高数据库的总体效率

在使用preparedstatement对象执行sql命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个preparedstatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的sql命令,使用preparedstatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行preparedstatement任务需要的时间长于statement任务,我会建议在除动态sql命令之外的所有情况下使用preparedstatement对象。

6、在成批处理重复的插入或更新操作中使用preparedstatement对象

如果成批地处理插入和更新操作,就能够显著地减少它们所需要的时间。oracle提供的statement和 callablestatement并不真正地支持批处理,只有preparedstatement对象才真正地支持批处理。我们可以使用addbatch()和executebatch()方法选择标准的jdbc批处理,或者通过利用preparedstatement对象的setexecutebatch()方法和标准的executeupdate()方法选择速度更快的oracle专有的方法。要使用oracle专有的批处理机制,可以以如下所示的方式调用setexecutebatch():

preparedstatement pstmt3d null;try {((oraclepreparedstatement)pstmt).setexecutebatch(30);…pstmt.executeupdate();}

调用setexecutebatch()时指定的值是一个上限,当达到该值时,就会自动地引发sql命令执行,标准的executeupdate()方法就会被作为批处理送到数据库中。我们可以通过调用preparedstatement类的sendbatch()方法随时传输批处理任务。

7、使用oracle locator方法插入、更新大对象(lob)

oracle的preparedstatement类不完全支持blob和clob等大对象的处理,尤其是thin驱动程序不支持利用preparedstatement对象的setobject()和setbinarystream()方法设置blob的值,也不支持利用setcharacterstream()方法设置clob的值。只有locator本身中的方法才能够从数据库中获取lob类型的值。可以使用preparedstatement对象插入或更新lob,但需要使用locator才能获取lob的值。由于存在这二个问题,因此,我建议使用locator的方法来插入、更新或获取lob的值。

8、使用sql92语法调用存储过程

在调用存储过程时,我们可以使用sql92或oracle pl/sql,由于使用oracle pl/sql并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用sql92。

9、使用object sql将对象模式转移到数据库中

既然可以将oracle的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在java中没有什么问题,但由于操作都是在数据库之外进行的,因此其他访问数据库的应用软件无法利用对象模式。如果利用oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用jpublisher等工具生成自己的java bean类。如果使用这种方式,不但java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。

10、利用sql完成数据库内的操作

我要向大家介绍的最重要的经验是充分利用sql的面向的方法来解决数据库处理需求,而不是使用java等过程化的编程语言。

如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编程人员创建了独立的update命令来成批地更新之一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个update命令中完成。当能够在单一的sql命令中完成任务,何必要让数据在网上流来流去的?我建议用户认真学习如何更大限度地发挥sql的功能

数据库setautocommit的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于数据库setautocommit,数据库setautocommit如何实现自动提交?,JDBC连接Oracle数据库之十大技巧的信息别忘了在本站进行查找喔。


数据运维技术 » 数据库setautocommit如何实现自动提交? (数据库setautocommit)