一、事务
什么是事务?
每条sql语句都是一个事务。
事务只对DML语句有效,对于DQL语句无效。
假设该操作有4个步骤。A、B、C、D,若ABCD四个步骤都成功完成,则认为事务成功;
若ABCD四个步骤中任意一个步骤失败,则认为事务失败。
- 事务的四大特性(ACID)
(1) 原子性-Atomicity
事务包含的所有操作,要么全部成功,要么全部失败回滚。
(2)一致性-Consistency
一致性是指事务必须使数据库从一个一致性状态转换到另外一个一致性状态,也就是说一个事务必须使数据库执行之前和执行之后都处于一致性状态。
让数据保持一定的合理性。
比如:一个商品出库时,仓库数量减一,购物车数量加一。
(3)隔离性-Isolation
隔离性是指当多个用户访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务直接要相互隔离。多个事务同时操作一张数据表,事务之间一个互相隔离,不互相影响。
即要达到这么一种效果:对于任意并发的两个事务T1和T2,在事务T1看来,T2要么在T1开始之前就结束,要么在T1结束之前才开始,这样两个事务就感觉不到有其他事务在并发进行。
(4)持久性-Durability
事务一旦提交,就没有办法更改,被永久记录在数据库中。
-
事务的开启:start transaction; 事务的开启具有隔离性,也就是当事务还没有提交的时候,其他用户访问到的数据库的数据没有发生改变;
-
事务的提交:commit; 当事务提交了之后,里面的数据就发生了改变,此时其他用户访问数据库的时候,就可以访问到被改变的数据库的数据了。
-
事务的回滚:rollback;
比如说在银行转账的过程中有两步,1.从你的账户扣钱 2. 收钱用户的账户加钱。例如当把你的钱扣了,但是给别人还没有把钱转过去,服务器就断电了,那么此时,就会rollback,你的钱虽然在过程被扣了,但是因为整个事务没有执行完毕,所以你的钱就会回来的。
-
一般情况下,rollback 和 commit只出现其一。
-
事务并发操作
(1)脏读:比如,一个员工的工资是3.6万一个月,老板发工资的时候不小心按错了,按成了3.9万,这时员工查看他的工资比之前多了3千,高兴坏了,此时,老板发现他把工资发错了,就rollback了一下,结果,员工查看他的工资又成了3.6万,空欢喜一场。
(2)不可重复读:比如:当一位男士卡里面有3.6万,他准备去买一个空调和洗衣机,就在这时,他的妻子拿他的卡去刷了一个包包,并提交。此时这位男士在付款的时候,服务员告诉他卡里没有钱了,他就很纳闷。 -
事务的隔离级别
(1)Read uncommitted 就是一个事务可以读取到另外一个未提交的事务;
(2) Read commit 一个事务只能读取到另外一个事务提交后的结果;
(3)Repeatable read 当一个事务在执行时,不允许其他事务来抢占资源;
(4)Serializable -
查看隔离级别:select @@global.tx_isolation,@@tx_isolation;
-
设置隔离级别:set global transaction isolation level read committed;
二、JDBC的步骤
JDBCUtils 是一个工具类,用于加载数据库,连接数据库,关闭资源。
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
private static String driver = null;
private static String username = null;
private static String password = null;
private static String url = null;
static {
try {
InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(in