首页 > 代码库 > 数据库事务性

数据库事务性

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 }
View Code

搭建数据库连接

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>
View Code

JdbcUtil.java   导入相关的类

1 public class JdbcUtil {
2     private static ComboPooledDataSource dataSource =new ComboPooledDataSource();
3     public static ComboPooledDataSource getDataSource()
4     {
5         return dataSource;
6     }
7 }
View Code

测试代码 。 注意 事务是针对一次连接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     }