TPL:事务控制语句
start transaction:开启一次事务
rollback:回滚
commit:提交事务
JDBC中与事务有关的方法:
Connection.setAutoCommit(boolean
b)
Connection.rollback()
Connection.rollback(Savepoint
sp)
Connection.commit();
*****四、事务的特性(隔离级别)
A:原子性。说明事务是一个不可分割的单位。
C:一致性.事务必须使数据库从一个一致性状态变换到另外一个一致性状态.(比如转账)
*I:隔离性。一个事务不能被其他事务打扰。
D:持久性。事务一旦提交,就应该被永久保存起来。
如果不考虑事务的隔离级别,会出现以下“不正确”的情况:
脏读:指一个事务读到了另一个事务中未提交的数据。
不可重复读:针对一条记录的,同一条记录前后不一样
虚读(幻读):针对一张表,前后读到的记录条数不一样。
MySQL中控制事务隔离级别的语句:
select @@tx_isolation; //查看当前的事务隔离级别
set
transaction isolation level 你的级别(四种之一);//设置隔离级别
隔离级别的分类:
READ UNCOMMITTED:脏读、不可重复读、虚读都有可能发生。
READ
COMMITTED:能避免脏读,不可重复读、虚读都有可能发生。
REPEATABLE
READ:能避免脏读、不可重复度,虚读都有可能发生。
SERIALIZABLE:能避免脏读、不可重复度、虚读。
1 create table bank
2 {
3 id int primary key,
4 name varchar(10),
5 money int
6 }
搭建数据库连接
c3p0-config.xml下
1 <?xml version="1.0" encoding="UTF-8"?>
2 <c3p0-config>
3 <default-config>
4 <property name="driverClass">com.mysql.jdbc.Driver</property>
5 <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/bank</property>
6 <property name="user">root</property>
7 <property name="password">mima</property>
8 </default-config>
9 </c3p0-config>
JdbcUtil.java 导入相关的类
1 public class JdbcUtil {
2 private static ComboPooledDataSource dataSource =new ComboPooledDataSource();
3 public static ComboPooledDataSource getDataSource()
4 {
5 return dataSource;
6 }
7 }
测试代码 。 注意 事务是针对一次连接Connection的,如果
QueryRunner runner =new QueryRunner(ds); 的话可能对于连接 会有不同的Connecton就达不到效果了
1 public static void main(String[] args) throws Exception {
2 DataSource ds=JdbcUtil.getDataSource();
3 Connection con=ds.getConnection();
4 QueryRunner runner =new QueryRunner();
5 try {
6 con.setAutoCommit(false);
7 } catch (SQLException e1) {
8 e1.printStackTrace();
9 }
10 try {
11 String sql1="update money_table set money=money+1000 where name = ?";
12 runner.update(con,sql1, new Object[]{"aa"});
13 int i=1/0;
14 String sql2="update money_table set money=money-1000 where name = ?";
15 runner.update(con,sql2, new Object[]{"bb"});
16 con.commit();
17
18 } catch (Exception e) {
19 try {
20 con.rollback();
21 } catch (SQLException e1) {
22 e1.printStackTrace();
23 }
24 e.printStackTrace();
25 }
26 finally
27 {
28
29 }
30
31 }
数据正常。
1 public static void main(String[] args) throws Exception {
2 DataSource ds=JdbcUtil.getDataSource();
3 Connection con=ds.getConnection();
4 QueryRunner runner =new QueryRunner();
5 try {
6 con.setAutoCommit(false);
7 } catch (SQLException e1) {
8 e1.printStackTrace();
9 }
10 Savepoint sp=null;
11 try {
12 String sql1="update money_table set money=money+1000 where name = ?";
13 runner.update(con,sql1, new Object[]{"aa"});
14 String sql2="update money_table set money=money-1000 where name = ?";
15 runner.update(con,sql2, new Object[]{"bb"});
16 sp=con.setSavepoint();
17 int i=1/0;
18 String sql3="update money_table set money=money+1000 where name = ?";
19 runner.update(con,sql3, new Object[]{"cc"});
20 String sql4="update money_table set money=money-1000 where name = ?";
21 runner.update(con,sql4, new Object[]{"dd"});
22
23
24 } catch (Exception e) {
25 try {
26 con.rollback(sp);
27 } catch (SQLException e1) {
28 e1.printStackTrace();
29 }
30 e.printStackTrace();
31 }
32 finally
33 {
34 con.commit();
35 }
36
37 }
数据库事务性
时间: 2024-11-05 18:53:14