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等字段 但是 ...
随机推荐
- MySQL Server has gone away报错原因汇总分析(转自:http://cenalulu.github.io/mysql/mysql-has-gone-away/)
原因1. MySQL 服务宕了 判断是否属于这个原因的方法很简单,执行以下命令,查看mysql的运行时长 $ mysql -uroot -p -e "show global status l ...
- Android - 采用 SharedPreferences 存储数据
SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data/data/<包名& ...
- CHECKSUM比较两表字段值差异
CHECKSUM 返回在表的行上或在表达式列表上计算的校验值.CHECKSUM 用于生成哈希索引. 语法 CHECKSUM ( * | expression [ ,...n ] ) 参数 * 指定在表 ...
- Spring 加载配置文件的方式
我们常用的加载context文件的方法有如下三个: 1.FileSystemXmlApplicationContext 这个方法是从文件绝对路径加载配置文件,例如: ApplicationContex ...
- sprintf函数详解
转摘声明:选自<CSDN 社区电子杂志——C/C++杂志> 在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望.由于sprintf 跟printf 在用法上几乎一样 ...
- zabbix_server部署,启动,及端口未监听问题
安装 下载地址:wget https://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.2.6/zabbix-3 ...
- docx4j基本操作
最近需要用docx4j来对docx进行一些操作,用到的技术是docx4j,这个技术在国内其实用的不是很多,看了一些博主的文章,有些感悟,做了一些总结,如果有疑问或错误之处欢迎交流. 创建包: Word ...
- 存储5——逻辑卷管理LVM
1. LVM概念 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘的分区在逻辑上 ...
- SSL/TSL握手过程详解
1. Client Hello 握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 Random1.客户端支持的加密套件(Support Ciphe ...
- springboot的相关信息
Maven的配置:zzp_settings.xml <?xml version="1.0" encoding="UTF-8"?> <setti ...