事务

事务

事务(Transaction,简写为tx)

1.当一个逻辑操作单元全部完成的时候,提交(commit)事务,这个操作就永久的保存到数据库中
2.如果回退(rollback),则放弃这个逻辑单元的所有操作
3.对于多个操作来说,作为一个整体(不可分割),所有操作成功(提交事务),数据库的数据才会改变

事务的ACID属性

1.原子性(Atomicity)
2.一致性(Consistency)
3.隔离性(Isolation)
4.持久性(Durability)

事务的操作

1.如果要控制事务,需要手动提交
2.在MySQL中,只有InnoDB存储引擎支持事务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package me.cscar.account.test;

import me.cscar.account.dao.impl.AccountDAOimpl;
import me.cscar.account.util.JDBCutil;
import org.junit.Test;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.SQLException;

public class TXBalance {

@Test
public void testTx() throws Exception {

BigDecimal money = new BigDecimal("1000");

AccountDAOimpl account = AccountDAOimpl.getInstance();
Connection conn = null;


try {
if (account.getBalance("嘤嘤", money)) {
conn = JDBCutil.getConnection();

//设置手动处理事务
conn.setAutoCommit(false);

account.addBalance("蛤蛤", money, conn);

//假设出错
int i = 1 / 0;

account.reduceBalance("嘤嘤", money, conn);

//全部操作成功,提交事务
conn.commit();
}
} catch (SQLException e) {
e.printStackTrace();
conn.rollback();
}

}
}

获取自动生成的主键

在数据库中保存数据的时候,要使用到自增id的时候就需要取出来.

1.如果要获取,需要设置一个标记.
    PreparedStatement prepareStatement(String sql,  int autoGeneratedKeys):获取预编译语句对象的时候,可以设置标记,是否要获取自动生成的主键.
    autoGeneratedKeys: 是否要获取自动生成的主键.
        Statement.RETURN_GENERATED_KEYS
2.获取自动生成的主键.
    ResultSet getGeneratedKeys(): 获取自动生成的主键.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class GetKey {
@Test
public void testGetKey() throws Exception {
//插入一条数据到account表中获取自动生成的组件
String sql = "INSERT INTO account (name,balance) VALUES (?,?)";
Connection conn = JDBCutil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setObject(1, "包包");
ps.setObject(2, 10000);
ps.executeUpdate();

//获取自动生产的组件
ResultSet rs = ps.getGeneratedKeys();

while (rs.next()) {
System.out.println(rs.getObject(1));
}

rs.close();
JDBCutil.close(ps, conn);
}
}