事务_事务的保存点_事务的隔离级别

事务_事务的保存点_事务的隔离级别


事务------------------------------------------------------------------------------------------

原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。
一致性(consistency):在事务处理执行前后,数据库是一致的(数据库数据完整性约束)。
隔离性(isolcation):一个事务处理对另一个事务处理的影响。
持续性(durability):事务处理的效果能够被永久保存下来 。

connection.setAutoCommit(false);//打开事务。
connection.commit();//提交事务。
connection.rollback();//回滚事务。

有时事务不起作用,可能是表引擎的问题。
show create table user;  查看表结构
 ENGINE=MyIsam 不支持事务和外键

事务的保存点(SavePoint)------------------------------------------------------------------------------------------

当只想撤销事务中的部分操作时可使用SavePoint

SavePoint sp = connection.setSavepoint();
connection.rollerbak(sp);//不带参数时,回滚整个事务,带SavePoint参数时,回滚到保存点
connection.commit();



隔离级别------------------------------------------------------------------------------------------

多线程并发读取数据时的正确性
connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

V:可能出现,X:不会出现
隔离级别
脏读
不可重复读
幻读
读未提交(Read uncommitted)
V
V
V
读已提交(Read committed)
x
V
V
可重复读(Repeatable read)
x
x
V
可串行化(Serializable )
x
x
x


事例:


数据库:

CREATE DATABASE jdbc;




USE jdbc;




CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `money` float unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=gbk; 


 


insert into user(name,birthday,money)values('zhangsan','1987-10-01',400);


insert into user(name,birthday,money)values('lisi','1988-09-14',35);


insert into user(name,birthday,money)values('wangwu','1947-07-09',670);





TxTest.java

package com.dwt1220;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;

public class TxTest {

	public static void main(String[] args) throws Exception {
		test();
	}

	static void test() throws SQLException {
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		Savepoint savepoint = null;
		try {
			conn = JdbcUtils.getConnection();

			/************打开事务*****************/
			conn.setAutoCommit(false);

			/************设置事务的隔离级别
			 * TRANSACTION_NONE--没有隔离级别
			 * TRANSACTION_READ_UNCOMMITTED--读未提交
			 * TRANSACTION_READ_COMMITTED--读已提交
			 * TRANSACTION_REPEATABLE_READ--可重复读
			 * TRANSACTION_SERIALIZABLE--可串行化
			 * *****************/
			conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
			
			st = conn.createStatement();
			String sql = "update user set money=money-10 where id=1";
			st.executeUpdate(sql);

			/************设置保存点*****************/
			savepoint = conn.setSavepoint();

			sql = "update user set money=money-10 where id=3";
			st.executeUpdate(sql);

			sql = "select money from user where id=2";
			st = conn.prepareStatement(sql);
			rs = st.executeQuery(sql);
			float money = 0.0f;
			if (rs.next()) {
				money = rs.getFloat("money");
			}
			if (money > 300) {
				throw new RuntimeException("已超过最大值!");
			}
			sql = "update user set money=money+10 where id=2";
			st.executeUpdate(sql);

			/************提交事务*****************/
			conn.commit();

		} catch (RuntimeException e) {
			if (conn != null && savepoint!=null ) {

				/************回滚到保存点*****************/
				conn.rollback(savepoint);
				conn.commit();//提交
				throw e;
			}
		} catch (SQLException e) {
			if (conn != null) {

				conn.rollback();
				throw e;
			}
		} finally {
			JdbcUtils.free(rs, st, conn);
		}
	}

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dwt1220

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值