您的位置:首页 > 数据库

数据库事务笔记

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();
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: