事务

来源:互联网 发布:剑三捏脸数据萝莉长歌 编辑:程序博客网 时间:2024/05/16 12:01

一、事务的隔离级别
数据库系统要负责隔离操作,写代码只需要对隔离级别进行设置。
1,如果不考虑事务的隔离级别,会出现以下问题(不正确的)
a,脏读:一个事务读取到了另一个事务“未提交”的数据。
b,不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。
c,虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

2,MySQL中操作事务隔离级别的命令
mysql>>select @@tx_isolation; #查看当前事务隔离级别
mysql>>set transaction isolation level 你的级别 #更改数据库当前事务隔离级别

隔离级别有四个级别(需要记住,注意是可能):
READ UNCOMMITTED:脏读,不可重复读,虚读都有可能发生
READ COMMITTED:防止脏读的发生,但是不可重复读,虚读都有可能发生
*REPEATABLE READ:防止脏读,不可重复读的发生,但是虚读有可能发生(数据库默认的)
SERIALIZABLE:防止脏读,不可重复读,虚读的发生,(提升到这个级别后,数据库会把整张表都锁住)
隔离级别原理,其实就是给行、表、数据库都加了一个锁。最高的隔离级别,必然有性能的问题,他锁了整张表,别人无法访问。
独占锁:增删改查都锁住了 共享锁:别人只能查
悲观锁:理论上可能发生的都要防住。乐观锁:只要基本上不发生的,就不加锁.

package com.ail.service;import java.sql.Connection;import java.sql.SQLException;import org.junit.Test;import cn.jdbc.utils.JDBCUtil3;import cn.jdbc.utils.JDBCc3p0util;import com.ail.dao.ACCdao;public class AccountS {    //转前的案例 aaa dao bbb 1000    public void tranfrom(String from,String to,double money) {        ACCdao ad = new ACCdao();        //获得连接        Connection con = null;        try{         con = JDBCUtil3.getConnection();        //开启事务         JDBCUtil3.opentransaction();            boolean b = ad.tran(from, to, money);         //关闭事务         JDBCUtil3.commit();        }catch (Exception e) {            e.printStackTrace();            try {                JDBCUtil3.rollback();            } catch (SQLException e1) {                // TODO Auto-generated catch block                e1.printStackTrace();            }        }    }@Testpublic void test() {    AccountS as = new AccountS();    as.tranfrom("aaa", "bbb", 100);}}package com.ail.dao;import java.sql.Connection;import java.sql.PreparedStatement;import cn.jdbc.utils.JDBCUtil3;public class ACCdao {    public boolean tran(String from, String to, double money) {        boolean b = true;        Connection con = null;        PreparedStatement ps = null;        try{            //获得连接               con=JDBCUtil3.getConnection();            //String sql= "update  account  set money=money+"++";            //转钱修改某一个个记录的值 update 表明  set  字段  (money=?)            String sql ="update account set money=money+? where name=?";             ps= con.prepareStatement(sql);            ps.setDouble(1, money);            ps.setString(2, from);            ps.executeUpdate();            ps.setDouble(1, -money);            ps.setString(2, to);            ps.executeUpdate();            return b;        }catch (Exception e) {            e.printStackTrace();        }finally{            JDBCUtil3.release(null, ps, null);        }        return false;    }}
0 0