- 浏览: 188007 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (321)
- eclipse (4)
- idea (2)
- Html (8)
- Css (14)
- Javascript (8)
- Jquery (6)
- Ajax Json (4)
- Bootstrap (0)
- EasyUI (0)
- Layui (0)
- 数据结构 (0)
- Java (46)
- DesPattern (24)
- Algorithm (2)
- Jdbc (8)
- Jsp servlet (13)
- Struts2 (17)
- Hibernate (11)
- Spring (5)
- S2SH (1)
- SpringMVC (4)
- SpringBoot (11)
- WebService CXF (4)
- Poi (2)
- JFreeChart (0)
- Shiro (6)
- Lucene (5)
- ElasticSearch (0)
- JMS ActiveMQ (3)
- HttpClient (5)
- Activiti (0)
- SpringCloud (11)
- Dubbo (6)
- Docker (0)
- MySQL (27)
- Oracle (18)
- Redis (5)
- Mybatis (11)
- SSM (1)
- CentOS (10)
- Ant (2)
- Maven (4)
- Log4j (7)
- XML (5)
最新评论
1. 事务的概念
2. MySQL对事务的支持
3. JDBC事务处理
4. 事务保存点
事务处理在数据库开发中有着非常重要的作用,所谓事务就是所有的操作要么一起成功,要么一起失败,事务本身具有原子性(Atomicity)、一致性(Consistency)、隔离性或独立性(Isolation)、持久性(Durability)4个特性,这4个特性也被称为ACID特征。 原子性:原子性是事务最小的单元,是不可再分隔的单元,相当于一个个小的数据库操作,这些操作必须同时成功,如果一个失败了,则一切的操作将全部失败。 一致性:指的是在数据库操作的前后是完全一致的,保证数据的有效性,如果事务正常操作则系统会维持有效性,如果事务出现了错误,则回到最原始状态,也要维持其有效性,这样保证事务开始时和结束时系统处于一致状态。 隔离性:多个事务可以同时进行且彼此之间无法访问,只有当事务完成最终操作时,才可以看到结果。 持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
2. MySQL对事务的支持
序号 命令 描述 1 SET AUTOCOMMIT=0 取消自动提交处理,开启事务处理 2 SET AUTOCOMMIT=1 打开自动提交处理,关闭事务处理 3 START TRANSACTION 启动事务 4 BEGIN 启动事务,相当于执行 START TRANSACTION 5 COMMIT 提交事务 6 ROLLBACK 回滚全部事务 7 SAVEPOINT 事务保存点名称 设置事务保存点 8 ROLLBACK TO SAVEPOINT 保存点名称 回滚操作到保存点
3. JDBC事务处理
4. 事务保存点
create table t_account ( id int(11) not null auto_increment, accountname varchar(20) default null, accountbalance int(11) default null, primary key (id) ) engine=innodb auto_increment=3 default charset=utf8; insert into t_account(id,accountName,accountBalance) values (1,'张三',500),(2,'李四',1000); Demo01.java package com.andrew.jdbc.chap09; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import com.andrew.jdbc.util.DbUtil; public class Demo01 { private static DbUtil dbUtil = new DbUtil(); // 转出 private static void outCount(Connection con, String accountName, int account) throws Exception { String sql = "update t_account set accountBalance=accountBalance-? where accountName=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, account); pstmt.setString(2, accountName); pstmt.executeUpdate(); } // 转入 private static void inCount(Connection con, String accountName, int account) throws Exception { String sql = "update t_account set accountBalance=accountBalance+? where accountName=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, account); pstmt.setString(2, accountName); pstmt.executeUpdate(); } public static void main(String[] args) { Connection connection = null; try { connection = dbUtil.getConnection(); connection.setAutoCommit(false); // 取消自动提交 System.out.println("张三开始向李四转账!"); int account = 500; outCount(connection, "张三", account); inCount(connection, "李四", account); System.out.println("转账成功!"); } catch (Exception e) { try { connection.rollback(); // 回滚 } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } finally { try { connection.commit(); // 提交事务 connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } 张三开始向李四转账! 转账成功! 500 1000 -> 0 1500 如果修改sql语句报错则不能执行
Demo02.java package com.andrew.jdbc.chap09; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Savepoint; import com.andrew.jdbc.util.DbUtil; public class Demo02 { private static DbUtil dbUtil = new DbUtil(); // 转出 private static void outCount(Connection con, String accountName, int account) throws Exception { String sql = "update t_account set accountBalance=accountBalance-? where accountName=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, account); pstmt.setString(2, accountName); pstmt.executeUpdate(); } // 转入 private static void inCount(Connection con, String accountName, int account) throws Exception { String sql = "update t_account set account=accountBalance+? where accountName=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, account); pstmt.setString(2, accountName); pstmt.executeUpdate(); } public static void main(String[] args) { Connection connection = null; Savepoint savepoint = null; try { connection = dbUtil.getConnection(); connection.setAutoCommit(false); // 取消自动提交 System.out.println("张三开始向李四转账!"); int account = 500; outCount(connection, "张三", account); savepoint = connection.setSavepoint(); // 设置一个保存点 inCount(connection, "李四", account); System.out.println("转账成功!"); } catch (Exception e) { try { connection.rollback(savepoint); // 回滚到savepoint保存点 } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } finally { try { connection.commit(); // 提交事务 connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } 运行结果: 张三开始向李四转账! com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'account' in 'field list' 500 1000 -> 0 1000
发表评论
-
使用元数据分析数据库
2019-04-18 00:13 4801. 使用DatabaseMetaData获取数据库基本信息 ... -
使用CallableStatement接口调用存储过程
2019-04-18 00:13 9651. CallableStatement接口的引入 Ca ... -
处理大数据对象
2019-04-17 09:18 4351. 处理大数据对象 大数据对象处理主要有CLOB(ch ... -
ResultSet结果集
2019-04-17 09:17 6871. ResultSet结果集的引入 当我们查询数据库时 ... -
使用PreparedStatement接口实现增,删,改操作
2019-04-17 09:17 6241. PreparedStatement接口引入 Pre ... -
使用Statement接口实现增,删,改操作
2019-04-17 09:17 7281. Statement接口引入 作用:用于执行静态SQ ... -
JDBC概述与连接
2019-04-17 09:17 4701. JDBC概述 1.1) JDBC简介 ...
相关推荐
总结起来,JDBC事务适用于简单的单库操作,而JTA事务则适合处理跨多个数据源的复杂事务场景。在J2EE环境中,容器管理的事务(如SessionBean中的JTA事务)能够提供更高的可伸缩性和可靠性。在实际应用中,根据需求...
### JavaBean中使用JDBC方式进行事务处理 #### 一、引言 在现代软件开发过程中,数据一致性是非常关键的一个方面,特别是在涉及到多个数据库操作时。本文将详细介绍如何在JavaBean中利用JDBC(Java Database ...
1. **JDBC事务的基本概念** - **事务**:事务是数据库系统中执行的一系列操作的集合,这些操作要么全部成功,要么全部失败。事务具有四大特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)...
在Java中,JDBC事务处理主要涉及以下几个关键概念: 1. **Connection对象**:它是与数据库的会话,通过该对象可以开启、提交和回滚事务。在连接池中获取到的Connection通常已经自动开启了事务,但如果没有,可以...
Sharding-JDBC是阿里巴巴开源的一款轻量级数据库中间件,它为Java开发者提供了一种透明化的数据分片解决方案,同时也支持分布式事务处理。在现代互联网应用中,面对海量数据和高并发的挑战,分布式事务成为了必不可...
本教程将深入探讨Java JDBC中的三层架构(三层架构是指表现层、业务逻辑层和数据访问层)以及事务处理,同时结合具体的转账案例来阐述可能遇到的问题和解决策略。此外,我们还会涉及单例模式和ThreadLocal在实际应用...
Java(JDBC)事务处理
二、JDBC事务处理 在数据库操作中,事务处理确保一组操作要么全部成功,要么全部失败,保证数据的一致性。在JDBC中,我们可以通过以下方式管理事务: 1. 设置自动提交为false:默认情况下,JDBC的每个数据库操作都...
事务模板是指提供模板方法对事务处理的代码进行控制。事务模板可以简化事务管理的代码,提供了统一的事务管理方法。例如,TransactionTemplate类提供了executeTransaction()方法,用于执行事务回调方法。 五、事务...
**JDBC事务初探** Java Database Connectivity (JDBC) 是Java平台中用于访问数据库的标准API。在处理数据库操作时,事务管理是确保数据一致性、完整性和持久性的重要机制。本篇将深入探讨JDBC中的事务处理,以及...
JDBC事务管理是数据库...总之,JDBC事务管理是确保数据库操作正确性和一致性的关键,通过理解和应用ACID原则以及适当的并发控制机制,开发人员可以有效地处理并发环境下的事务处理,保证系统的稳定性和数据的完整性。
在2PC中,事务处理监视器(TPM)先询问所有资源管理器(如数据库)是否准备好提交,然后再决定全局提交或回滚。JTA事务更复杂,但能保证分布式事务的一致性。 最后,我们提到的是**事务的传播特性**,这是Spring...
例如,一个典型的JDBC事务处理代码如下: ```java Connection con = DriverManager.getConnection(); con.setAutoCommit(false); try { // 事务中的操作 con.commit(); } catch (Exception e) { con.rollback(); ...
**源码分析**:深入理解Spring JDBC事务管理的源码,可以帮助开发者更好地定制和优化事务处理。关键类如`TransactionDefinition`定义了事务属性,如隔离级别、超时时间等;`TransactionStatus`接口则表示当前事务的...
JDBC 事务处理是通过 Connection 对象来控制事务的提交和回滚。例如,在 JDBC 中,可以使用 Connection 对象的 setAutoCommit 方法来禁用自动事务提交,然后使用 commit 方法来提交事务,或者使用 rollback 方法来回...
通过`jdbc_demo`这样的源码文件,开发者可以学习到如何在实际项目中使用这些概念,从而更好地理解和掌握JDBC事务处理。实践中,开发者可以参考这些示例代码,结合具体的业务需求,编写自己的事务管理逻辑。
### JDBC事务控制详解 在数据库应用开发中,事务管理是一项重要的功能,它确保了一系列操作能够作为一个整体被正确地执行或回滚。Java Database Connectivity (JDBC) 是 Java 平台中用于连接数据库的标准 API,提供...
这不利于事务处理,因为无法控制何时提交或回滚事务。 2. **手动提交模式**:通过调用`Connection`对象的`setAutoCommit(false)`方法,可以关闭自动提交,从而开始手动事务管理。在手动模式下,需要显式调用`commit...
JDBC事务处理 JDBC支持事务管理,可以控制一组数据库操作作为一个原子单元。通过设置Connection的自动提交属性(`conn.setAutoCommit(false)`)来开启手动事务,并使用`commit()`和`rollback()`方法提交或回滚事务...