事务

作为逻辑处理的基本单位,对于数据库操作来说由一条或者多条sql语句来构成。当然还有针对非数据库操作的,如在计算机中设置的还原点即是一个非常好的应用。

对于事务的基本性质在还有一篇中有所叙述:SQL 事务及实例演示

oracle和sql server在事务上差别


sql server中的事务一般分为隐式事务、显式事务、自己主动提交事务。

自己主动事务:对于sql server来说,当client提交一条sql语句时,这时候sql
server都会自己主动启动一个事务;对于这种事务,在运行完sql语句后会自己主动提交。

显示事务:这也是比較常见的使用的事务;事实上实质上也就是在自己主动事务上,添加一个Begintran,conn.commit,end tran.

隐式事务:相比显示事务须要开启connection,隐式事务是默认开启事务的Begin和数据库连接的。当然后面还是要进行commit或rollback操作的。

而oracle的事务就没有这么如此丰富了,和sql server的隐式事务类似;无需开启conn和Begin,仅仅要在兴许操作进行commit或rollback操作。

事务提交的机制


先了解一些基础的概念,data buffer cache:相当于一块连接硬盘文件和oracle数据操作的快速仅仅读缓存。

SGA:在启动oracle实例后,在内存中开辟的一块内存空间,用于存放server的控制信息以及数据。

数据块:数据存储的基本单位。

当连接到数据库后,oracle为连接的用户创建独立的进程-影子进程,这个进程伴随用户的整个操作;

1.检查数据块

2.构造undo数据块

以此来回滚数据

3.生成redo日志

用于又一次操作的日志存放在log buffer cache中。

4.lgwr进程启动,提交事务并书写全部日志文件

java事务处理


TestDemo:结合位于java.sql以下的接口 PreparedStatement和oracle事务实现批量删除

经常用法:

int[]executeBatch():

将一批命令提交给数据库来运行,假设所有命令运行成功,则返回更新计数组成的数组。

voidsetString(int parameterIndex,

               String x):

将指定參数设置为给定Java String 值。在将此值发送给数据库时,驱动程序将它转换成一个 SQL VARCHAR 或 LONGVARCHAR 值。

Demo

/**删除用户-2014年8月11日18:19:04
* @userId 用户id数组
*/
publicBoolean DeleteUser(String[] userId){
//一个线程安全的可变字符串
StringBuffersb=new StringBuffer();
sb.append("deletefrom t_user where user_id =?");
Connectionconn=null;
PreparedStatementpsmt = null;
Booleanflag=false; conn=DButil.getConnection();
try {
//关闭自己主动提交事务
conn.setAutoCommit(false);
//创建一个 PreparedStatement 对象来将參数化的 SQL语句发送到数据库。
psmt= conn.prepareStatement(sb.toString());
//将一组參数加入到此 PreparedStatement 对象的批处理命令中。
for(inti =0 ;i<userId.length;i++){
psmt.setString(1,userId[i].trim());
psmt.addBatch();
} // 运行批量更新
psmt.executeBatch();
// 语句运行完成,提交本事务
conn.commit(); flag=true;
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
try{
conn.rollback();
}catch (SQLException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
}
} returnflag;
}

总结


总的来说,感觉还是对oracle非常多内部的机制了解的有限。前几天的设计模式讲课,也让想到这里的一些东西才有了这篇博客。仅仅能说是非常浅显的认知,oracle在事务这里的处理相比在事务的处理上本质还是一致的。 跨网络或进程间的数据通信,应该是粗粒度,而不是细粒度的。也就是说:client与数据库之间不应该频繁的交互,浪费资源;
或者进程间也是相同的道理.而数据库之间的事务处理也是这样一个思维的体现。

最新文章

  1. libvirt 安装篇
  2. C# 读取excel日期时获取到数字转换成日期
  3. [转]SQL三种获取自增长的ID方法
  4. uboot环境变量实现分析
  5. jboss的时区问题
  6. Tuple元祖
  7. Android 线程Thread的2种实现方法
  8. Windows 安装Django并创建第一个应用
  9. 使用注解@Transient使表中没有此字段
  10. Android-----------国际化多国语言文件夹命名汇总
  11. 【grunt整合版】 30分钟学会使用grunt打包前端代码
  12. lt&amp;gt&amp;eq
  13. Mysql中的in和find_in_set的区别?
  14. PHP编译安装时常见错误解决办法
  15. centos7下zabbix4.0配置磁盘IO监控
  16. 20172306 2018-2019-2 《Java程序设计》第五周学习总结
  17. annotation注释简单介绍
  18. easyui treegrid idField 所在属性中值有花括号(如Guid)当有鼠标事件时会报错,行记录一下
  19. 更新Newtonsoft.Json后报异常,未能加载文件或程序集“Newtonsoft.Json
  20. FreeRTOS 调试方法(printf---打印任务执行情况)

热门文章

  1. Java 类执行顺序
  2. CSS 实现毛玻璃效果
  3. VINS-Mono论文笔记(未完)
  4. iOS 导航栏风格
  5. [Python3网络爬虫开发实战] 6.3-Ajax结果提取
  6. linux下nginx、php和mysql安装配置
  7. jsp include html 乱码问题解决
  8. rbac组件之权限操作(四)
  9. Matlab学习笔记(二)
  10. Python关于函数作为返回值的理解(3分钟就看完了)