pervasive sql transaction

java后台,使用pervasive 数据库,jdbc连接。
conn.setAutoCommit(false);//事务开启
String sql = "select * from 表名 where ShukkaSijiNo =?for update ";//ShukkaSijiNo 是主键
for update失效。

使用for update时,必须置于事务中,事务要能生效,特别是spring中事务方法必须是public,且必须是由类外调用该事务方法。其次,如果有读写分离中间件,必须保证for update到主库。最后检查下是否有设置二级缓存等,如有则需去除掉

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料中的代码来看,似乎并没有直接涉及到Pervasive数据库的连接操作,因此需要先确认是否已经正确连接上Pervasive数据库。

    如果已经成功连接Pervasive数据库,但在使用JDBC进行"for update"处理时失效,建议尝试使用Pervasive JDBC驱动来连接Pervasive数据库进行操作,可以参考以下步骤:

    1. 下载并导入Pervasive JDBC驱动。可以到Pervasive官网下载相应版本的JDBC驱动,然后将该驱动文件添加到项目中的classpath中。

    2. 使用Pervasive JDBC驱动来连接数据库。具体操作可以参考以下代码示例:

    String dbUrl = "jdbc:pervasive://localhost:1583/sampledb";
    String user = "username";
    String pass = "password";
    java.sql.Connection conn = null;
    try {
        conn = DriverManager.getConnection(dbUrl, user, pass);
        conn.setAutoCommit(false);
        PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM table FOR UPDATE");
        //省略其他操作
    } catch (Exception e) {
        //异常处理
    } finally {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                //ignore
            }
        }
    }
    
    1. 在PreparedStatement中使用"FOR UPDATE"语句来进行查询。如上述代码示例中所示,可以在PreparedStatement中直接使用"FOR UPDATE"语句进行查询操作。

    希望以上内容对您有所帮助!

select for update 是为了在查询时,对这条数据进行加锁,避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性。你的目的是什么啊

在mysql的InnoDB数据库中,select for update是有效的,pervasive 数据库没有用过,不清楚是否支持,但理论上应该支持。
这里提一个别的实现方式:不用select for update,而是在update时判断原值有没有被修改,如果被修改,就重新查询再update,这种方式也叫乐观锁。例如:假设你需要更新的字段是 total , 先查询:
select * from 表名 where ShukkaSijiNo =?; // 将 现在的total 只存放到 total_old中。
update 表名 set total = ? where ShukkaSijiNo =?and total = tolal_old;
然后判断update语句返回的记录条数,如果是0,表示没有更新成功,就重复该操作,直到update语句返回记录数为1。

for update是在数据库中上锁用的,可以为数据库中的行上一个排它锁。当一个事务的操作未完成时候,其他事务可以读取但是不能写入或更新。
举个例子

比如一张表三个字段 , id(商品id), name(商品名字) , count(数量) 
当商品抢购时候会显示剩余商品件数,如果并发量大的时候,商品自减的值可能不准确。所以当我们在一个事务中对count字段进行修改的时候,其他事务应该只能读取指定id的count,而不能进行update等操作。这个时候就需要用到for update.

sql语句:
start transaction ; 
select * from table_name where id =1 for update ;

update table_name set count = count - 1 where id= 1;


在pervasive数据库,不同版本的for update语法不一样,要确认你的数据库版本是多少,在Pervasive 11 或更高版本中,它现在已经被更名为 Actian Zen

如果你在使用 Pervasive 数据库的 JDBC 驱动连接时使用了 "for update" 该语句,但是未能获取到数据行的排他锁并且查询后续的操作不是由同一个连接执行的,则可能会出现 "for update" 失效的情况。

这种情况下,一个可能的解决办法是重新构建程序以确保查询和更新操作在同一个数据库事务中执行。对于 Pervasive 数据库,需要在应用程序的连接 URL 中设置 "transaction isolation" 参数以确保查询和更新操作在同一事务中。

示例连接 URL:


String url = "jdbc:pervasive://hostname:1583/dbname?transaction_isolation=2";

以上代码中, transaction_isolation=2 的设置表示使用事务隔离级别 "SERIALIZABLE",这可以确保 "for update" 查询在其它事务执行更新操作前获取数据行的排他锁。如果你在查询和更新操作中使用了相同的连接,则无需担心 "for update" 失效的问题。

另外,如果你需要从多个应用程序中访问 Pervasive 数据库,则需要确保所有的应用程序都使用相同的事务隔离级别,并且在执行更新操作前获取数据行的排他锁。

数据库引擎不支持 for update 子句:某些数据库引擎可能不支持 for update 子句或在特定情况下不起作用。这可能是 Pervasive 数据库的特性之一。

ShukkaSijiNo 字段名称和数据库里面的名称保持一致,selects查询,不是update更新哦,下面是update 语句.

UPDATE table_name SET [column_name1= value1,... column_nameN = valueN] [WHERE condition]