数据库事务笔记
2016-03-12 23:06
169 查看
事务的概念:
一组要么同时执行成功,要么同时执行失败的sql语句。是数据库操作的一个执行单元!
事务开始于
连接到数据库上,并执行一条DML语句(INSERT UPDATE 或DELETE)
前一个事务结束后,又输入了另外一条DML语句
事务结束于:
执行commit(提交事务)或rollback(回滚:失败之后进行回滚)
执行一条DDL语句,例如create table 语句;在这种情况下会自动执行commit语句;
执行一条DCL语句,例如grant;在这种情况下,会自动执行commit语句
断开与数据库的连接
执行了一条DML语句,该语句却失败了;在这种情况下,会为这个无效的DML语句执行rollback语句
事务具有
原子性:表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败
一致性:表示一个事务内有一个操作失败时,所有更改过的数据都必须回滚到修改前的状态
隔离性:事务查看数据时所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的事务。
持久性:持久事务完成之后,它对于系统的影响是永久性的
案例:
package com.ydr.hnu;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestShiWu {
public static void main(String[] args)
{
Connection conn = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myjdbc","root","ydrwtt");
conn.setAutoCommit(false);//JDBC中默认为true是自动提交,现在设为false就是手动提交
//准备执行第一条sql语句
ps1 = conn.prepareStatement("update myfirsttb set age=20 where id='20131206'");
ps1.execute();//执行
//准备执行第第二条sql语句
ps2 = conn.prepareStatement("update mytable set money=307 where no='20131202'");
ps2.execute();//执行
conn.commit();//手动提交
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();//如果出错,则回滚
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}finally{//关闭连接
try {
if(ps1!=null){
ps1.close();
}
if(ps2!=null){
ps2.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
一组要么同时执行成功,要么同时执行失败的sql语句。是数据库操作的一个执行单元!
事务开始于
连接到数据库上,并执行一条DML语句(INSERT UPDATE 或DELETE)
前一个事务结束后,又输入了另外一条DML语句
事务结束于:
执行commit(提交事务)或rollback(回滚:失败之后进行回滚)
执行一条DDL语句,例如create table 语句;在这种情况下会自动执行commit语句;
执行一条DCL语句,例如grant;在这种情况下,会自动执行commit语句
断开与数据库的连接
执行了一条DML语句,该语句却失败了;在这种情况下,会为这个无效的DML语句执行rollback语句
事务具有
原子性:表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败
一致性:表示一个事务内有一个操作失败时,所有更改过的数据都必须回滚到修改前的状态
隔离性:事务查看数据时所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的事务。
持久性:持久事务完成之后,它对于系统的影响是永久性的
案例:
package com.ydr.hnu;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestShiWu {
public static void main(String[] args)
{
Connection conn = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myjdbc","root","ydrwtt");
conn.setAutoCommit(false);//JDBC中默认为true是自动提交,现在设为false就是手动提交
//准备执行第一条sql语句
ps1 = conn.prepareStatement("update myfirsttb set age=20 where id='20131206'");
ps1.execute();//执行
//准备执行第第二条sql语句
ps2 = conn.prepareStatement("update mytable set money=307 where no='20131202'");
ps2.execute();//执行
conn.commit();//手动提交
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();//如果出错,则回滚
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}finally{//关闭连接
try {
if(ps1!=null){
ps1.close();
}
if(ps2!=null){
ps2.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
相关文章推荐
- Oracle常见错误总结
- mysql数据类型
- mysql常见错误
- 使用SKIP-GRANT-TABLES 解决 MYSQL ROOT密码丢失(转)
- ubuntu下pdo mysql的安装
- linux下mysql的简单配置及监控
- MySQL安装及主从配置
- 学习使用bmob云数据库的使用方法
- mysql-connector-java.jar包和源代码下载地址
- MySQL(5.6)数据库索引
- mysql5.7以上解压版安装
- MySQL学习笔记之四:并发控制和事务机制
- [mysql] mysql 5.6.27 innodb 相关参数
- 基本SQL语句
- mysql和oracle的分页
- Redis-benchmark测试Redis性能
- mysql
- Redis命令说明
- 完全卸载oracle11g步骤
- MySQL系列:SQL语句详解