set autocommit=0; 设置数据库的事物自动提交为手动提交(test表,id name字段)
此时 客户端一 update test t set t.name='c' where t.id=1; 如果没有commit
此时客户端二 update test t set t.name='a' where t.id=1; 则会被锁定在等待状态,,知道客户端一提交,客户端二才回执行更新操作
默认查询方法是没有锁的,即客户端一查询操作,,客户端二不会等待,,
如果想让客户端一查询时,客户端二 等待,则可以给查询加一个update锁
行锁:客户端一: select * from test where id=1 for update ;
客户端二: update test t set t.name='d' where t.id=1; 处于等待状态,,虽然是查询,但是加了一个update锁后,
相当于客户端一正在执行,update操作,并且没有提交
此时 select * from test for update 也是等待状态
select * from test where id=2 for update ;等待状态
表锁:
mysql表如果没有指定主键,默认是表级锁,即update一行数据时(未提交时),其他行数据时不可以update的
客户端1:update test t set t.name='c' where t.id=1;
客户端2:update test t set t.name='d' where t.id=2; 处于等待状态
如果指定主键时,则默认是行级锁,,即只锁定该行
大多数的数据库默认都是行级锁
此时 客户端一 update test t set t.name='c' where t.id=1; 如果没有commit
此时客户端二 update test t set t.name='a' where t.id=1; 则会被锁定在等待状态,,知道客户端一提交,客户端二才回执行更新操作
默认查询方法是没有锁的,即客户端一查询操作,,客户端二不会等待,,
如果想让客户端一查询时,客户端二 等待,则可以给查询加一个update锁
行锁:客户端一: select * from test where id=1 for update ;
客户端二: update test t set t.name='d' where t.id=1; 处于等待状态,,虽然是查询,但是加了一个update锁后,
相当于客户端一正在执行,update操作,并且没有提交
此时 select * from test for update 也是等待状态
select * from test where id=2 for update ;等待状态
表锁:
mysql表如果没有指定主键,默认是表级锁,即update一行数据时(未提交时),其他行数据时不可以update的
客户端1:update test t set t.name='c' where t.id=1;
客户端2:update test t set t.name='d' where t.id=2; 处于等待状态
如果指定主键时,则默认是行级锁,,即只锁定该行
大多数的数据库默认都是行级锁
绝大多数的数据库的默认隔离级别是提交读,,mysql的默认级别是可重复度
在hibernate中可以在hibernate.cfg.xml中设置自动提交为false,在业务层的具体插入,更新,删除,方法中 用spring的事务来控制事务
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
而在jdbc中 可以先设置数据库事务为手动提交
// 设置数据库的事务为手动提交
conn.setAutoCommit(false);
如果操作成功,则提交事务
否则,回滚
if (i > 0) {
// 更新成功
balance = newMoney + "";
//提交事务
conn.commit();
}else{
//回滚信息
conn.rollback();
}