JDBC中的事物处理
一项事物是由一个或是多个操作所组成的一个不可分割的工作单元。我们通过提交commit()或是回退rollback()来结束事务的操作。
JDBC的事物处理包括三个方面:
1:自动提交模式;
2:事务隔离模式;
3:存储点;
数据库并发操作过程中会出现以下三种不确定的情况:
脏读。当应用程序使用了被另一个应用程序修改过的数据,而这个数据处于未提交状态时,就会发生脏读。第二个应用程序随后会请求回滚被其修改的数据。第一个事务使用的数据就会被损坏,或者“变脏”。
单读。当一个事务获得了数据,而该数据随后被一个单独的事务所更改时,若第一个事务再次读取更改后的数据,就会发生单读。这样,第一个事务进行了一个单读。
虚读。当事务通过某种查询获取了数据,另一个事务修改了部分该数据,原来的事务第二次获取该数据时,就会发生虚读。第一个事务现在会有不同的结果集,它可能包含虚读。\
我们可以设置事物隔离级别来解决:
| TRANSACTION_READ_UNCOMMITTED | ur | 就是俗称“脏读”(dirty read),在没有提交数据时能够读到已经更新的数据 |
| TRANSACTION_READ_COMMITTED | cs | 在一个事务中进行查询时,允许读取提交前的数据,数据提交后,当前查询就可以读取到数据。update数据时候并不锁住表 |
| TRANSACTION_REPEATABLE_READ | rs | 在一个事务中进行查询时,不允许读取其他事务update的数据,允许读取到其他事务提交的新增数据 |
| TRANSACTION_SERIALIZABLE | rr | 在一个事务中进行查询时,不允许任何对这个查询表的数据修改。 |
存储点:
作用: 在事物进行中的某个位置设置一个标识,这样事物就可以在不影响这个存储点之前的工作的情况下进行回滚,将应用程序返回到一个已知的状态。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint; import javax.naming.spi.DirectoryManager; public class JDBC { public static void main(String args[]){
String dirverName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String userName = "root";
String userPassword = "1";
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
Savepoint sp = null; try {
Class.forName(dirverName);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
conn = DriverManager.getConnection(url, userName, userPassword);
//将事物自动提交设置为false
conn.setAutoCommit(false);
//设置事物的隔离级别
conn.setTransactionIsolation(conn.TRANSACTION_READ_COMMITTED);
String sql = "create table users(id int primary key, name varchar(50))";
pst = conn.prepareStatement(sql);
pst.execute();
//事物提交
conn.commit();
pst.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} try {
//设置存储点
sp = conn.setSavepoint();
String sql = "insert into users values(1,'Jack')";
pst = conn.prepareStatement(sql);
pst.executeUpdate(sql);
conn.commit();
//如果成功提交释放存储点
conn.releaseSavepoint(sp);
pst.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("失败。。");
e.printStackTrace();
try {
System.out.println("失败。。");
//回滚放到存储点
conn.rollback(sp);
pst.close();
conn.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} } }
}
JDBC中的事物处理的更多相关文章
- Spring中的事物管理,用 @Transactional 注解声明式地管理事务
事物: 事务管理是企业级应用程序开发中必不可少的技术, 用来确保数据的 完整性和 一致性. 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用 事务的四 ...
- JDBC中的事务-Transaction
事务-Transaction 某些情况下我们希望对数据库的某一操作要么整体成功,要么整体失败,经典的例子就是支付宝提现.例如我们发起了支付宝到银行卡的100元提现申请,我们希望的结果是支付宝余额减少1 ...
- Spring中的事物管理----HelloWorld
在学习Spring的事物管理之前明白先明白几个概念1什么是事物:事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用例子说明:例如银行转账,A账户转账(转2 ...
- JDBC中DAO+service设计思想
一.DAO设计思想 a) Data access Object(数据访问对象):前人总结出的一种固定模式的设计思想. 高可读性. 高复用性. 高扩展性. b) JDBC代码实现的增删改查操作是有复用需 ...
- JDBC中的Statement和PreparedStatement的区别
JDBC中的Statement和PreparedStatement的区别
- [转]JDBC中日期时间的处理技巧
Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒.毫秒以及时区的控制方法,同时也提供一些工具方法,比如日期/时间的比较,前后判断等. java.uti ...
- Oracle数据库编程:在JDBC中应用Oracle
9.在JDBC中应用Oracle: JDBC访问数据库基本步骤: 1.加载驱动 2.获取链接对象 3.创建SQL语句 4.提交S ...
- JDBC中的ResultSet无法多次循环的问题。
前几天碰见了一个很奇葩的问题,使我百思不得其解,今天就写一下我遇见的问题吧,也供大家参考,别和我犯同样的毛病. 首先说下jdbc,jdbc是java是一种用于执行SQL语句的Java API,从jdb ...
- 在JDBC中使用Java8的日期LocalDate、LocalDateTime
在实体Entity里面,可以使用java.sql.Date.java.sql.Timestamp.java.util.Date来映射到数据库的date.timestamp.datetime等字段 但是 ...
随机推荐
- 拼接的html的onclick事件中无法传递对象给js方法的处理办法
如下: 拼接的html: " onclick=\"valDocName2('"+JSON.stringify(doc).replace(new RegExp(" ...
- Thinkphp --- 路由定义
thinkPHP的路由: thinkphp下的 conf 下可以进行配置:(154行) /* 系统变量名称设置 */ 'VAR_MODULE' => 'm', // 默认模块获取变量 'VAR_ ...
- log4j 设置将生成的日志进行gz压缩并删除过期日志
1.准备jar :log4j-1.2.17.jar,commons-logging-1.2.jar,这2个就可以了,其他关于日志的jar包就不要加进来了,在优先级上会有冲突. 2.定义一个类,继承R ...
- 【node】------mongoose的基本使用------【巷子】
1.安装mongoose npm install mongoose 2.启动数据库 mongod --dbpath d:\data\db 3.引入mongoose模块并连接数据库 const mong ...
- javascript飞机大战-----004创建子弹对象
/* 创建子弹:因为子弹不是只创建一个所以要用构造函数 注意一点:子弹发射的位置应该是英雄机的正中央的位置,所以需要传点东西进来 */ function Bullet(l,t){ this.l = l ...
- could not execute menu item系统找不到指定的文件
Wamp3.0.6 64bit,系统任务栏图标,左键,Apache菜单,httpd.conf,报错“could not execute menu item.....系统找不到指定的文件” 根据网上的搜 ...
- 配置oem
[oracle@kaifai ~]$ export ORACLE_SID=dbking[oracle@kaifai ~]$ export ORACLE_SID=kaifai[oracle@kaifai ...
- 利用gulp解决微信浏览器缓存问题
做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问 ...
- FW:stash install
先下载破解安装包.http://pan.baidu.com/s/1mgumBbE 我的安装环境. 说明下,经过我的测试. 如果系统内存低于 512M, 就不要折腾了,非常卡. 推荐 2048M 内存. ...
- Python开发【笔记】:进程
序言 进程与线程概述: 很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统. 什么叫“多任务”呢?简单地说,就是操作系统可以同时运 ...