上一篇提到了数据库事务的ACID特性,那么谁来保证数据库事务具有ACID呢?其实,只要向数据库系统声明一个事务,数据库系统就会自动保证事务的ACID特性的。那么下面从抽象的概念上来看看怎么声明事务:
----- BEGIN 事务的开始边界
----- COMMIT 事务的正常结束边界,提交事务,永久保存被事务更新后的数据库状态。
----- ROLLBACK 事务的异常结束边界,撤销事务,使数据退回到执行事务前的初始状态。
数据库系统支持以下两种事务模式:
----- 自动提交模式:每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。
----- 手工提交事务:必须由数据库的客户端显式指定事务开始边界和结束边界。
以MySQL为例,如果我们启动一个MySQL客户端,就会得到一个独立的数据库连接。每个数据库连接都有一个全局变量@@autocommit,表示当前的事务模式,它有两个可选值:
----- 0:表示手工提交模式。
----- 1:默认值,表示自动提交模式。
可以通过SQL命令 SELECT @@autocommit 来查看当前的事务模式。如果想要把当前的事务模式改为手工提交模式,可以使用以下SQL命令 SET autocommit=0 来实现。
还要多说几句,在MySQL中,数据库表分为三种类型:INNODB、BDB、MyISAM。其中前两种类型的表支持数据库事务,而MyISAM类型的表不支持事务。在使用CREATE TABLE命令创建表时默认的类型为MyISAM,如果希望更改的话可以通过如下DLL来进行:
ALTER TABLE table_name TYPE=INNODB;
如果希望在创建时就指定表的类型,可以通过以下DLL来进行:
CREATE TABLE table_name(
.....
.....
) TYPE=INNODB;
好了,下面我们来看几个在实践应用程序中声明事务的模板。
1.在MySQL.exe客户端程序中声明事务
我们以一条插入语句为例,当然如果是自动提交模式的话,每一个SQL语句都是一个单独的事务,我们直接运行以下语句就可以了:
mysql>INSERT INTO qq_account VALUES('leon', 1000);
下面我们看看在手动模式下的命令:
mysql>SET autocommit=0;
mysql>BEGIN;
mysql>INSERT INTO qq_account VALUES('leon', 1000);
mysql>COMMIT;
这样一个事务就完成了,下面我们看一看如何撤销一个事务,很简单也许你已经猜到了吧
mysql>BEGIN;
mysql>INSERT INTO qq_account VALUES('leon', 1000);
mysql>ROLLBACK;
2.在JDBC API中声明事务
没有什么难度,我们直接来看看代码:
- Connection con = null;
- Statement stmt = null;
- try {
- con = DriverManager.getConnection(dbUrl,dbUser,dbPwd);
-
- con.setAutoCommit(false);
- stmt = con.createStatement();
- stmt.executeUpdate("INSERT INTO qq_account VALUES ('leon', 1000)");
-
- con.commit();
- } catch(SQLException e) {
- if(con != null) {
- try {
-
- con.rollback();
- } catch(SQLException e) {
- ......
- }
- }
- ......
- } finally {
- if(con != null) {
- try{
- if(stmt != null) {
- try {
- stmt.close();
- } catch(SQLException e) {
- ......
- }
- }
- con.close();
- } catch(SQLException e) {
- ......
- }
- }
- }
没有什么可再说的了,代码详细得已经像是一篇技术文章了,需要注意的是对于新建的Connection实例来说,在默认的情况下采用自动提交的事务模式,通过方法 con.setAutoCommit(false)来设置手动提交模式。
3.在Hibernate API中声明事务
Hibernate封装了JDBC API和JTA API,尽管应用程序可以绕过Hibernate API,直接通过JDBC API和JTA API来声明事务,但是这不利于跨平台的开发,下面我们只考虑Hibernate API的实现:
- Configuration config = new Configuration().configure();
- SessionFactory factory = config.buildSessionFactory();
- Session session = factory.openSession();
- Transation tx = null;
- try {
-
- tx = session.beginTransaction();
- Account account = new Account("leon",1000);
- session.save(account);
-
- tx.commit();
- } catch(HibernateException e) {
- if(tx != null) {
- try {
-
- tx.rollback();
- } catch(HibernateException e) {
- ......
- }
- }
- ......
- } finally {
- if(session != null) {
- try {
- session.close();
- } catch(HibernateException e) {
- ......
- }
- }
- }
上面的代码和JDBC API很相像,值得注意的是,在任何时候,一个Session只允许有一个未提交的事务。以下代码对于一个Session同时声明了两个未提交的事务,这是不允许的:
tx1 = session.beginTransaction();
tx2 = session.beginTransaction();
......
tx1.commit();
tx2.commit();
好了,今天就写到这里吧,顺便唠叨一句,看到新的一期《程序员》里面的调查71%的程序员通过写技术BLOG提升自己的技术水平,坚定了自己作技术BLOG的信心,每天都记录下自己的学习轨迹,让自己更加的充实...
分享到:
相关推荐
- 对于多个操作需要一起成功或一起失败的情况,可以使用数据库事务来确保数据一致性。 10. 性能优化: - 通过合理设计数据库结构、索引和查询语句,以及适当使用缓存和批处理,可以提高应用程序的性能。 综上所...
Oracle数据库工作备忘录 Oracle数据库是全球广泛使用的大型企业级关系型数据库管理系统,由甲骨文公司(Oracle Corporation)开发。它以其高效、稳定和强大的功能著称,被广泛应用于金融、电信、政府和各类企业的...
本文将详细讲解如何实现“android 备忘录 数据库存储到本地 定时提醒”的核心知识点。 首先,我们关注的是数据存储。在Android中,本地数据存储通常有多种方式,如Shared Preferences、Internal Storage、External ...
《C#备忘录源码解析与数据库应用》 C#是一种面向对象的编程语言,由微软公司开发,广泛应用于Windows平台的软件开发。在这个“C# 备忘录源码(含数据库)”项目中,我们将深入探讨如何利用C#实现一个功能完备的备忘...
2. **EditActivity.java** - 编辑备忘录的Activity,用户可以输入新备忘录或者修改已有的。 3. **DatabaseHelper.java** - SQLite数据库帮助类,负责数据库的创建、升级以及数据操作。 4. **ReminderReceiver.java**...
总的来说,"备忘录,免费桌面备忘录,M备忘"是一款结合了MFC的强大功能和ACCESS数据库的高效数据管理的桌面应用。它以其轻巧的体积、免费的特性以及可定制的源代码,为用户提供了便捷、可靠的备忘解决方案。通过这款...
7. 数据库事务: SQLite支持事务处理,可以确保数据的一致性和完整性。`BEGIN`, `COMMIT` 和 `ROLLBACK` 语句用于控制事务。例如,当执行一系列操作时,可以包裹在事务中,以确保它们要么全部成功,要么全部回滚: ...
这个系统的主要目标是提供一套便捷的工具,让用户能够轻松地管理他们的日常事务,包括创建、编辑、查找和删除备忘录。同时,系统还集成了对Windows系统内建小工具如记事本和计算器的访问,以增强用户体验。 首先,...
- 数据存储:备忘录的数据通常存储在SQLite数据库中,每个备忘录条目是一个记录,包含文字和图片的二进制数据。图片可能以Blob形式存储,或者通过URI引用外部文件系统中的图像。 - UI组件:应用可能使用...
本文将详细介绍一款由C#语言编写的Winform安装程序,它是一个功能完备的备忘录应用,能够帮助用户轻松管理日常事务,设定提醒,确保重要事项不会被遗漏。 C#,全称CSharp,是微软公司推出的一种面向对象的编程语言...
该备忘录程序是一款简洁实用的应用,旨在帮助用户高效记录和管理日常事务。用户可以轻松创建、编辑和删除备忘录,支持设置提醒功能,以确保不会错过重要事项。应用界面直观,操作流畅,用户可以通过标签和分类功能对...
【手机备忘录程序】是一种常见且实用的智能手机应用程序,主要功能是帮助用户记录日常生活、工作中的重要事项或想法,确保不会遗忘待办任务。它通常具有简洁的用户界面和高效的提醒机制,使得用户可以方便地创建、...
6. **SQLite数据库**: 对于支持多个备忘录,开发者可能需要建立一个本地SQLite数据库来存储各个备忘录条目,便于快速检索和编辑。 7. **UI设计与交互**: 设计简洁易用的备忘录小部件界面至关重要。这包括字体、颜色...
【备忘录系统】是一个由个人开发的软件应用,它提供了创建、管理和删除备忘录的基本功能,旨在帮助用户方便地记录和跟踪日常事务。这个系统可能是用VC(Visual C++)作为编程语言,结合SQL(Structured Query ...
2. **备忘录创建与编辑**:用户可以创建新的备忘录,输入标题、内容、优先级、截止日期等信息,并支持后期编辑。 3. **分类与标签管理**:备忘录可以按照类别或者标签进行归档,方便用户查找和管理。 4. **搜索与...
2. 创建表:备忘录应用的核心是一个“备忘录”表,我们需要用SQL语句创建它。表结构可能包括ID(主键)、标题、内容和创建时间等字段。例如,创建表的SQL语句可能是: ```sql CREATE TABLE Memo ( ID INTEGER ...
【个人备忘录源码】是一个专为个人设计的备忘录应用程序的源代码,它提供了记录、管理和检索日常事务的功能。源码的编写语言可能是Delphi,这是一款基于Object Pascal的集成开发环境,以其高效的编译器和丰富的组件...
【标题】:“一个简单的备忘录” 在移动设备上,备忘录应用程序是日常生活中非常实用的工具,用于记录各种待办事项、想法或者提醒。本项目提供了一个详细的安卓备忘录源码实现,涵盖了核心功能如添加、删除、修改...
2. **数据存储**:备忘录的数据通常保存在本地,可以使用SQLite数据库存储。SQLite是一个轻量级的关系型数据库,适用于移动设备。开发者需要创建数据库表,定义字段,以及相应的增删查改(CRUD)操作。 3. **...