设置事务模式及隔离级别

来源:互联网 发布:瑞士军刀淘宝能卖吗 编辑:程序博客网 时间:2024/06/07 03:53

每启动一个mysql.exe程序,就会得到一个单独的数据库连接。每个数据库连接都有个全局变量@@autocommit,表示当前的事务模式,它有两个可选值:

–0:表示手工提交模式。

–1:默认值,表示自动提交模式。

•如果要察看当前的事务模式,可使用如下SQL命令:

–mysql> select @@autocommit

•如果要把当前的事务模式改为手工提交模式,可使用如下SQL命令:

–mysql> set autocommit=0;


——在自动提交模式下提交事务:

•在自动提交模式下,每个SQL语句都是一个独立的事务。如果在一个mysql.exe程序中执行SQL语句:

–mysql>insert into ACCOUNTS values(1,'Tom',1000);

•MySQL会自动提交这个事务,这意味着向ACCOUNTS表中新插入的记录会永久保存在数据库中。此时在另一个mysql.exe程序中执行SQL语句:

–mysql>select * from ACCOUNTS;

•这条select语句会查询到ID为1的ACCOUNTS记录。这表明在第一个mysql.exe程序中插入的ACCOUNTS记录被永久保存,这体现了事务的ACID特性中的持久性。


——在手工模式下提交事务:

•在手工提交模式下,必须显式指定事务开始边界和结束边界:

–事务的开始边界:begin

–提交事务:commit

–撤销事务:rollback

例:

–mysql>begin;
–mysql>select * from ACCOUNTS;
–mysql>commit;



通过JDBC API声明事务边界:


1• Connection提供了以下用于控制事务的方法:

–setAutoCommit(boolean autoCommit):设置是否自动提交事务

–commit():提交事务

–rollback():撤销事务

例:

try {

con = java.sql.DriverManager.getConnection(dbUrl,dbUser,dbPwd);

//设置手工提交事务模式

con.setAutoCommit(false);

stmt = con.createStatement();

//数据库更新操作1

stmt.executeUpdate("update ACCOUNTS set BALANCE=900 where ID=1 ");

//数据库更新操作2

stmt.executeUpdate("update ACCOUNTS set BALANCE=1000 where ID=2 ");

con.commit(); //提交事务

}catch(Exception e) {

try{

con.rollback(); //操作不成功则撤销事务

}catch(Exception ex){

//处理异常

……

}

//处理异常

……

}finally{…}


2.通过Hibernate API声明事务边界:


•声明事务的开始边界:Transaction tx=session.beginTransaction();

•提交事务: tx.commit();

•撤销事务: tx.rollback();


多个事务并发时的并发问题:


第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。

脏读:一个事务读到另一事务未提交的更新数据。

虚读:一个事务读到另一事务已提交的新插入的数据。

不可重复读:一个事务读到另一事务已提交的更新数据。

第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一事务已提交的更新数据。



数据库的隔离级别

1.在mysql.exe程序中中设置隔离级别:


•每启动一个mysql.exe程序,就会获得一个单独的数据库连接。每个数据库连接都有个全局变量@@tx_isolation,表示当前的事务隔离级别。MySQL默认的隔离

级别为Repeatable Read。如果要察看当前的隔离级别,可使用如下SQL命令:

–mysql> select @@tx_isolation;

•如果要把当前mysql.exe程序的隔离级别改为Read Committed,可使用如下SQL命令:

–mysql> set transaction isolation level read committed;


2.在Hibernate中设置隔离级别:


•在Hibernate的配置文件中可以显式的设置隔离级别。每一种隔离级别都对应一个整数:

–1:Read Uncommitted

–2:Read Committed

–4:Repeatable Read

–8:Serializable

•例如,以下代码把hibernate.cfg.xml文件中的隔离级别设为Read Committed:

hibernate.connection.isolation=2

对于从数据库连接池中获得的每个连接,Hibernate都会把它改为使用Read Committed隔离级别。


mysql、Hibernate默认的事务隔离级别都是可重复读


原创粉丝点击