原生(DBUtils)事务与回滚

给大家推荐个靠谱的公众号程序员探索之路,大家一起加油https://i-blog.csdnimg.cn/blog_migrate/93320939ba8f8b0a898e29429753f496.png

所用到的工具类介绍:http://blog.csdn.net/yueloveme/article/details/77653690

原生

 

package com.qf.zzh;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.qf.dbutils.c3p0Utils;

public class test {

	/**
	 * @param args
	 */
	// 脏读:值为1,TRANSACTION_READ_UNCOMMITTED
	// 不可重复读:值为2,TRANSACTION_READ_COMMITTED
	// 虚读和幻读:值为4,TRANSACTIION_REPEATABLE_READ
	// 完整的隔离性:值为8,TRANSACTION_SERIALIZABLE
	// 时机开发当中常用的是第二个和第三个
	// oracle的默认是2
	// mysql的默认是4
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = c3p0Utils.getConnection();
			// 设置提交方式为非自动提交
			// 一旦autocommit为false
			// 你必须调用conn.commit()才会提交
			conn.setAutoCommit(false);
			// 设置事务的隔离级别
			// 不要写数字,要引用类的常量
			// 1.可读性强
			// 2,API有一日升级了,4代表别的意思了,但是TRANSACTION_REPEATABLE_READ它代表的意思永远不会改变
			// 即使这句话不写也是默认值为TRANSACTION_REPEATABLE_READ 因为连接的是mysql数据库
			conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
			// 1左移32位然后减1
			// System.out.println((1<<32)-1);
			// int类型的最大值
			// System.out.println(Integer.MAX_VALUE);
			String sql = "insert into tableb(id,name) values(10,'asdf')";
			ps = conn.prepareStatement(sql);
			ps.executeUpdate();

			// 手动设置异常 则 这个事务没执行完 也就是没有提交 所有 得回滚 就没有添加进去
			// 那么此时数据库没有永久保存
			int num = 5 / 0;

			sql = "insert into tableb(id,name) values(11,'asdf')";
			ps = conn.prepareStatement(sql);
			ps.executeUpdate();
			System.out.println("YES");
			conn.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} finally {
			try {
				if (conn != null) {
					conn.close();
				}
				if (conn != null) {
					ps.close();
				}

			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

 

 

工具类

 

 

package com.qf.zzh;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

import com.qf.dbutils.c3p0Utils;

public class TestDbutils {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 选择空参构造,使得queryrunner对象并不能拥有一个连接。
		QueryRunner qr = new QueryRunner();
		// 从池中获取一个连接
		Connection conn = c3p0Utils.getConnection();
		try {
			// 把这连接设置成不自动连接
			conn.setAutoCommit(false);
			String sql = "insert into tableb(id,name) values(30,'qwer')";
			// qr对象是用一个不自动提交的conn进行sql语句执行。
			qr.update(conn, sql);

			int num = 5 / 0;

			sql = "insert into tableb(id,name) values(31,'qwer')";
			qr.update(conn, sql);
			conn.commit();
			System.out.println("YES");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} finally {
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

}

 


当然还有一个问题  就是 如果连接自动提交设置为false那么归还的时候也是false,

 

 

* 那么下一次取出来的连接还是为false,这显然不是想要的,其实在连接池的配置文件中每次用的时候都置为了true

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值